第一个Go程序

1. 创建第一个Go程序

$GOPATH/src下新建文件夹hello,使用VSCode打开hello文件夹,在该文件夹下创建main.go文件,文件内容为:

1
2
3
4
5
6
7
package main  // 声明main包

import "fmt" // 导入 fmt 包,打印字符串是需要用到

func main() { // 声明 main 主函数
fmt.Println("Hello World!") // 打印 Hello World!
}

如下图所示:
第一个Go程序

打开命令行工具(快捷键ctrl + shift + `),运行:

1
go run main.go

显示结果:
运行结果

2. package(创建包)

Go语言以“包”作为管理单位,每个 Go 源文件必须先声明它所属的包,所以我们会看到每个 Go 源文件的开头都是一个 package 声明,格式如下:

1
package name

其中 package是声明包名的关键字,name为包的名字。

Go语言的包与文件夹是一一对应的,它具有以下几点特性:

  • 一个目录下的同级文件属于同一个包。
  • 包名可以与其目录名不同。
  • main包是Go语言程序的入口包,一个Go语言程序必须有且仅有一个main包。如果一个程序没有main包,那么编译时将会出错,无法生成可执行文件。

3. import(导入包)

在包声明之后,是 import 语句,用于导入程序中所依赖的包,导入的包名使用双引号””包围,格式如下:

1
import "name"

其中import是导入包的关键字,name为所导入包的名字。

代码第3行导入了fmt包,这行代码会告诉Go编译器,我们需要用到fmt包中的函数或者变量等,fmt包是Go语言标准库为我们提供的,用于格式化输入输出的内容(类似于C语言中的stdio.h头文件),类似的还有os包、io包等。

另外有一点需要注意,导入的包中不能含有代码中没有使用到的包,否则Go编译器会报编译错误,例如imported and not used: "xxx",”xxx”表示包名。

也可以使用一个import关键字导入多个包,此时需要用括号( )将包的名字包围起来,并且每个包名占用一行,也就是写成下面的样子:

1
2
3
4
import(
"name1"
"name2"
)

4. main 函数

代码的第5行创建了一个main函数,它是Go语言程序的入口函数,也即程序启动后运行的第一个函数。main函数只能声明在main包中,不能声明在其他包中,并且,一个main包中也必须有且仅有一个main函数。

C/C++程序的入口函数也是main(),一个C/C++程序有且只能有一个main()函数。

main函数是自定义函数的一种,在Go语言中,所有函数都以关键字func开头的,定义格式如下所示:

1
2
3
func 函数名(参数列表) (返回值列表){
函数体
}

格式说明如下:

  • 函数名:由字母、数字、下画线_组成,其中,函数名的第一个字母不能为数字,并且,在同一个包内,函数名称不能重名。
  • 参数列表:一个参数由参数变量和参数类型组成,例如:
    1
    func foo( a int, b string )
  • 返回值列表:可以是返回值类型列表,也可以是参数列表那样变量名与类型的组合。函数有返回值时,必须在函数体中使用return语句返回。
  • 函数体:能够被重复调用的代码片段。

❗️注意:Go语言函数的左大括号{必须和函数名称在同一行,否则会报错。

5. 打印 Hello World

代码的第6行fmt.Println("Hello World!")中,Printlnfmt包中的一个函数,它用来格式化输出数据,比如字符串、整数、小数等,类似于C语言中的printf函数。这里我们使用Println函数来打印字符串,也就是( )里面使用""包裹的部分。

注意,Println函数打印完成后会自动换行,ln是line的缩写。

点号.是Go语言运算符的一种,这里表示调用fmt包中的Println函数。

另外,代码fmt.Println("Hello World!")的结尾,不需要使用;来作为结束符,Go编译器会自动帮我们添加,当然,在这里加上;也是可以的。

6. Go中的main函数和init函数

Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main)。这两个函数在定义时不能有任何的参数和返回值。

虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个package中每个文件只写一个init函数。

Go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。每个package中的init函数都是可选的,但package main就必须包含一个main函数。

程序的初始化和执行都起始于main包(package main)。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过程:
程序导入包的顺序

参考资料

[1] http://c.biancheng.net/view/6036.html
[2] https://blog.csdn.net/rznice/article/details/18987047