让我们从经典的Hello, World程序开始,这是编程学习中的传统起点。这个简单的例子能够很好地展示Go语言的核心概念和基本结构。

下面是一个最基本的Go程序示例:
|package main import "fmt" func main() { fmt.Println("你好,世界!") }
这个程序虽然简单,却包含了Go语言程序的几个重要组成部分。让我们逐一分析这些元素。
Go是一门编译型语言,这意味着源代码需要经过编译才能运行。Go工具链会将你的源代码及其依赖项转换为计算机能够直接执行的机器指令。这些工具都通过一个统一的go命令来访问,该命令包含多个子命令。
其中最简单的子命令是run,它会编译以.go结尾的源文件,链接必要的库文件,然后直接运行生成的可执行文件。在本书中,我们将使用$符号来表示命令提示符。
要运行我们的程序,只需在终端中输入:
|$ go run hello.go
运行后,程序会在控制台输出:
|你好,世界!
Go语言原生支持Unicode,因此可以处理世界上各种语言的文本,包括中文、日文、阿拉伯文等。
如果你的程序不仅仅是一次性实验,而是需要重复使用,那么建议先编译程序并保存编译结果。这可以通过go build命令来实现:
|$ go build hello.go
这个命令会创建一个名为hello的可执行文件,你可以随时运行它而无需重新编译:
|$ ./hello
现在让我们深入了解程序的结构。Go代码被组织成包(package),这类似于其他语言中的库或模块。一个包由单个目录中的一个或多个.go源文件组成,这些文件定义了包的功能。
每个源文件都以包声明开始,这里我们使用的是package main,它声明了文件所属的包。包声明后面跟着导入声明,列出了该文件需要使用的其他包,然后是存储在文件中的程序声明。
Go标准库包含超过100个包,涵盖了输入输出、排序、文本处理等常见任务。例如,fmt包包含了格式化输出和输入扫描的函数。
Println是fmt包中的一个基本输出函数,它会打印一个或多个值,用空格分隔,并在末尾添加换行符,使输出显示为单行。
package main是特殊的,它定义了一个独立的可执行程序,而不是库。在package main中,func main函数也是特殊的——它是程序执行的入口点。
无论main函数做什么,就是程序要做的事情。当然,main函数通常会调用其他包中的函数来完成大部分工作,比如调用fmt.Println函数。
我们必须告诉编译器这个源文件需要哪些包,这就是导入声明的作用。虽然"Hello, World"程序只使用了一个包中的一个函数,但大多数程序会导入更多的包。
你必须精确导入所需的包。如果缺少必要的导入或包含不必要的导入,程序将无法编译。这种严格的要求可以防止未使用的包引用在程序演化过程中累积。
导入声明必须跟在包声明之后。之后,程序由函数、变量、常量和类型的声明组成(由关键字func、var、const和type引入)。在大多数情况下,声明的顺序并不重要。
Go语言不要求在语句或声明的末尾使用分号,除非两个或多个语句出现在同一行。实际上,某些标记后面的换行符会被转换为分号,因此换行符的位置对正确解析Go代码很重要。
例如,函数开始的大括号{必须与func声明的结尾在同一行,不能单独占一行。在表达式x+y中,允许在+操作符后面换行,但不允许在前面换行。
Go语言对代码格式化采取了强硬立场。gofmt工具会将代码重写为标准格式,而go工具的fmt子命令会将gofmt应用到指定包中的所有文件,默认情况下是当前目录中的文件。
本教程中的所有Go源文件都经过了gofmt处理,你应该养成对自己代码进行同样处理的习惯。通过强制规定标准格式,消除了许多关于琐事的无意义争论,更重要的是,它启用了各种自动源代码转换,如果允许任意格式化,这些转换将是不可行的。
许多文本编辑器可以配置为在每次保存文件时运行gofmt,这样你的源代码总是格式正确。一个相关的工具goimports还可以根据需要管理导入声明的插入和删除。它不是标准发行版的一部分,但你可以通过以下命令获取:
|$ go get golang.org/x/tools/cmd/goimports
一个简单的你好世界程序尽然包含这么多知识点,但是我相信你一定感到兴奋。下面让我们正式开始学习Go语言!