当前位置: 首页 > news >正文

Hello, World

1.1. Hello, World

我们以现已成为传统的“hello world”案例来开始吧,这个例子首次出现于1978年出版的C语言圣经《The C Programming Language》(译注:本书作者之一Brian W. Kernighan也是《The C Programming Language》一书的作者)。C语言是直接影响Go语言设计的语言之一。这个例子体现了Go语言一些核心理念。

gopl.io/ch1/helloworld

package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}

Go是一门编译型语言,Go语言的工具链将源代码及其依赖转换成计算机的机器指令(译注:静态编译)。Go语言提供的工具都通过一个单独的命令go调用,go命令有一系列子命令。最简单的一个子命令就是run。这个命令编译一个或多个以.go结尾的源文件,链接库文件,并运行最终生成的可执行文件。(本书使用$表示命令行提示符。)

$ go run helloworld.go

毫无意外,这个命令会输出:

Hello, 世界

Go语言原生支持Unicode,它可以处理全世界任何语言的文本。

如果不只是一次性实验,你肯定希望能够编译这个程序,保存编译结果以备将来之用。可以用build子命令:

$ go build helloworld.go

这个命令生成一个名为helloworld的可执行的二进制文件(译注:Windows系统下生成的可执行文件是helloworld.exe,增加了.exe后缀名),之后你可以随时运行它(译注:在Windows系统下在命令行直接输入helloworld.exe命令运行),不需任何处理(译注:因为静态编译,所以不用担心在系统库更新的时候冲突,幸福感满满)。

$ ./helloworld
Hello, 世界

本书中所有示例代码上都有一行标记,利用这些标记可以从gopl.io网站上本书源码仓库里获取代码:

gopl.io/ch1/helloworld

执行 go get gopl.io/ch1/helloworld 命令,就会从网上获取代码,并放到对应目录中(需要先安装Git或Hg之类的版本管理工具,并将对应的命令添加到PATH环境变量中。序言已经提及,需要先设置好GOPATH环境变量,下载的代码会放在$GOPATH/src/gopl.io/ch1/helloworld目录)。2.6和10.7节有这方面更详细的介绍。

来讨论下程序本身。Go语言的代码通过(package)组织,包类似于其它语言里的库(libraries)或者模块(modules)。一个包由位于单个目录下的一个或多个.go源代码文件组成,目录定义包的作用。每个源文件都以一条package声明语句开始,这个例子里就是package main,表示该文件属于哪个包,紧跟着一系列导入(import)的包,之后是存储在这个文件里的程序语句。

Go的标准库提供了100多个包,以支持常见功能,如输入、输出、排序以及文本处理。比如fmt包,就含有格式化输出、接收输入的函数。Println是其中一个基础函数,可以打印以空格间隔的一个或多个值,并在最后添加一个换行符,从而输出一整行。

main包比较特殊。它定义了一个独立可执行的程序,而不是一个库。在main里的main 函数 也很特殊,它是整个程序执行时的入口(译注:C系语言差不多都这样)。main函数所做的事情就是程序做的。当然了,main函数一般调用其它包里的函数完成很多工作(如:fmt.Println)。

必须告诉编译器源文件需要哪些包,这就是跟随在package声明后面的import声明扮演的角色。hello world例子只用到了一个包,大多数程序需要导入多个包。

必须恰当导入需要的包,缺少了必要的包或者导入了不需要的包,程序都无法编译通过。这项严格要求避免了程序开发过程中引入未使用的包(译注:Go语言编译过程没有警告信息,争议特性之一)。

import声明必须跟在文件的package声明之后。随后,则是组成程序的函数、变量、常量、类型的声明语句(分别由关键字funcvarconsttype定义)。这些内容的声明顺序并不重要(译注:最好还是定一下规范)。这个例子的程序已经尽可能短了,只声明了一个函数,其中只调用了一个其他函数。为了节省篇幅,有些时候示例程序会省略packageimport声明,但是,这些声明在源代码里有,并且必须得有才能编译。

一个函数的声明由func关键字、函数名、参数列表、返回值列表(这个例子里的main函数参数列表和返回值都是空的)以及包含在大括号里的函数体组成。第五章进一步考察函数。

Go语言不需要在语句或者声明的末尾添加分号,除非一行上有多条语句。实际上,编译器会主动把特定符号后的换行符转换为分号,因此换行符添加的位置会影响Go代码的正确解析(译注:比如行末是标识符、整数、浮点数、虚数、字符或字符串文字、关键字breakcontinuefallthroughreturn中的一个、运算符和分隔符++--)]}中的一个)。举个例子,函数的左括号{必须和func函数声明在同一行上,且位于末尾,不能独占一行,而在表达式x + y中,可在+后换行,不能在+前换行(译注:以+结尾的话不会被插入分号分隔符,但是以x结尾的话则会被分号分隔符,从而导致编译错误)。

Go语言在代码格式上采取了很强硬的态度。gofmt工具把代码格式化为标准格式(译注:这个格式化工具没有任何可以调整代码格式的参数,Go语言就是这么任性),并且go工具中的fmt子命令会对指定包,否则默认为当前目录中所有.go源文件应用gofmt命令。本书中的所有代码都被gofmt过。你也应该养成格式化自己的代码的习惯。以法令方式规定标准的代码格式可以避免无尽的无意义的琐碎争执(译注:也导致了Go语言的TIOBE排名较低,因为缺少撕逼的话题)。更重要的是,这样可以做多种自动源码转换,如果放任Go语言代码格式,这些转换就不大可能了。

很多文本编辑器都可以配置为保存文件时自动执行gofmt,这样你的源代码总会被恰当地格式化。还有个相关的工具,goimports,可以根据代码需要,自动地添加或删除import声明。这个工具并没有包含在标准的分发包中,可以用下面的命令安装:

$ go get golang.org/x/tools/cmd/goimports

对于大多数用户来说,下载、编译包、运行测试用例、察看Go语言的文档等等常用功能都可以用go的工具完成。10.7节详细介绍这些知识。

相关文章:

  • 蒋鑫鸿:9.10国际黄金原油最新外盘行情趋势点评附解一套技术指导
  • gem5 GPGPU-Sim 安装踩坑笔记
  • 【Linux私房菜】—— 远程登录与数据传输、Vim与Vi的基础用法、关机与重启、登录与注销、运行级别、root密码找回
  • JSR-133: JavaTM Memory Model and Thread Specification原文解析
  • html网页如何获取后台数据库的数据(html + ajax + php + mysql)
  • Spring之事务实现原理及其注解@Transactional底层和传播机制原理
  • 第14章: 集合
  • Java后端开发工程师学习笔记【狂神说Java笔记】
  • Linux上的中文输入法安装(Ubuntu + Kali五笔拼音)
  • java+php+python的公文审批系统-办公系统
  • 使用C语言+USRP B210从零开始实现无线通信(4) 接收检测与解调
  • Spark系列从入门到精通(二)
  • hive之full outer join(全连接)使用方法
  • Hamiton图系列文章 (1) Hamilton图证明算法的道路矩阵基础数据结构与类的设计
  • 计算机毕业设计ssm+vue基于微信的产品订单管理小程序
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • bearychat的java client
  • canvas 五子棋游戏
  • CAP理论的例子讲解
  • Git同步原始仓库到Fork仓库中
  • input的行数自动增减
  • js继承的实现方法
  • Promise初体验
  • text-decoration与color属性
  • ubuntu 下nginx安装 并支持https协议
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 大主子表关联的性能优化方法
  • 搞机器学习要哪些技能
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端存储 - localStorage
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我这样减少了26.5M Java内存!
  • 小李飞刀:SQL题目刷起来!
  • 异步
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • C# - 为值类型重定义相等性
  • ​【已解决】npm install​卡主不动的情况
  • #laravel 通过手动安装依赖PHPExcel#
  • #QT(串口助手-界面)
  • $().each和$.each的区别
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (三)模仿学习-Action数据的模仿
  • (十六)一篇文章学会Java的常用API
  • (一)Neo4j下载安装以及初次使用
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net Core和.Net Standard直观理解
  • .NET 发展历程
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献