Featured image of post hello-world

hello-world

永恒的“hello,world”!

一门计算机语言的学习依然从永恒的“hello,world”这个例子开始。

创建一个go文件,命名为:main.go

1
2
3
4
5
6
7
8
9
package main

import (
	"fmt"
)

func main() {
	fmt.Println("hello,world")
}

Go是编译型的语言。Go的工具链将程序的源文件转变成机器相关的原生二进制指令。这些工具可以通过单一的go命令配合其子命令进行使用。最简单的子命令是run,它将一个或多个以.go后缀的源文件进行编译、链接,然后运行生成的可执行文件:

1
$ go run main.go

不出意料地,控制台会输出:

1
hello,world

Go原生地支持Unicode,所以它可以处理所有国家地语言。

如果这个程序不是一次性的实验,那么编译输出成一个可复用的程序比较好。这通过子命令build来实现:

1
$ go build main.go

这条命令生成了一个叫做main.exe的可执行文件,执行命令,得到

1
2
$ ./main.exe
hello,world

说说main.go程序本身。Go代码是使用包来组织的,包类似于其他语言中的库或者模块。一个包由一个或多个.go源文件组成,放在一个文件夹中,该文件夹的名字描述了包的作用。每一个源文件的开始都用package声明,例子里面是package main,指明了这个文件属于哪个包。后面跟着它导入的其他包的列表,然后是存储在文件的程序声明。

Go的标准库中由100多个包用来完成输入、输出、排序、文本处理等常规任务,也有syscallruntime包等进行底层相关的处理任务。例如,fmt包中的函数用来格式化输出和扫描输入。Printlnfmt中一个基本的输出函数,它输出一个或多个用空格分隔的值,结尾使用一个换行符,这样看起来这些值是单行输出。

名为main的包比较特殊,它用来定义一个独立的可执行程序,而不是库。在main包中,函数main也是特殊的,不管在什么程序中,main做什么事情,它总是程序开始执行的地方。当然,main通常调用其他包中的函数来做更多的事情,比如fmt.Println

我们需要告诉编译器源文件需要哪些包,用package声明后面的import来导入这些包。

你必须精确地导入需要地包。在缺失导入或存在不需要的包的情况下,编译会失败,这种严格的要求可以防止程序演化中引用不需要的包。当然,其实你并不需要花费额外的精力来判断你需要精确导入哪些包,Goland会为你在使用某个包的函数的时候,为你自动导入这个包,它也会为你删除冗余的包。

import声明必须跟在package声明之后。import导入声明后面,是组成程序的函数、变量、常量、类型(以func、var、const、type开头)声明。

一个函数的声明由func关键字、函数名、参数列表(main函数为空)、返回值列表(可以为空)、放在大括号内的函数体组成,函数体定义函数是用来做什么的。

image-20220811120150699

Go不需要再语句或声明后面使用分号结尾(C#,C++,Java中需要),除非有多语句或声明出现再同一行。事实上,在程序进行预编译的时候,跟在特定符号后面的换行符会被转换为分号,所以在什么地方换行会影响对Go代码的解析。例如,“{”符号必须和关键字func在同一行,不能单独成行,并且在x+y这个表达式中,换行符可以在+操作符的后面,但是不能在+操作符的前面。如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import (
	"fmt"
)

func main() {
	var (
		x = 1
		y = 1
	)
	ans := x +
		y
	fmt.Println(ans)
}

Go对于代码的格式化要求非常严格。gofmt工具将代码以标准格式重写,go工具的fmt子命令使用gofmt工具来格式化指定包里的所有文件或者当前文件夹中的文件(默认情况下)。

许多文本编辑器可以配置为每次在保存文件时(ctrl+s)自动运行gofmt,因此源文件总可以保持正确的形式。此外,一个相关的工具goimports可以按需管理导入声明的插入和移除。它不是标准发布版的一部分。

例如Goland

打开设置->工具->保存时的操作

勾选重新格式化代码优化import即可

image-20220811115238077

此外goimports工具可以用Goland插件-GO Imports Tidy代替,使用快捷键ctrl+鼠标右键双击进行包整理

image-20220811115435509

渝ICP备2022001449号
本站总访问量