go的基本介绍
Go的特点
- 高性能,该并发
- 部署简单,学习简单
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
Hello World
1 | package main |
Go是一门编译型语言,Go语言的工具链将源代码及其依赖转换成计算机的机器指令(静态编译)。Go语言提供的工具都通过一个单独的命令go
调用,go
命令有一系列子命令。最简单的一个子命令就是run。这个命令编译一个或多个以.go结尾的源文件,链接库文件,并运行最终生成的可执行文件。要想运行上述程序,命令行进入其目录,执行命令:
1 | go run helloworld.go |
Go语言原生支持Unicode,它可以处理全世界任何语言的文本。
如果不只是一次性实验,并且希望能够编译这个程序,保存编译结果以备将来之用。可以用build子命令:
1 | go build helloworld.go |
这个命令生成一个名为helloworld
的可执行的二进制文件(Windows系统下生成的可执行文件是helloworld.exe),之后可以随时运行它(在Windows系统下在命令行直接输入helloworld.exe命令运行),不需任何处理(因为静态编译,所以不用担心在系统库更新的时候冲突,python也有相关的库pyinstaller
将程序转为可执行文件)。
1 | ./helloworld |
Go的简介(挺有意思的,建议看看)
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
声明之后。随后,则是组成程序的函数、变量、常量、类型的声明语句(分别由关键字func
、var
、const
、type
定义)。这些内容的声明顺序并不重要(最好按照规范要求自己)。上述例子的程序已经尽可能短了,只声明了一个函数,其中只调用了一个其他函数。为了节省篇幅,有些时候示例程序会省略package
和import
声明,但是,这些声明在源代码里有,并且必须得有才能编译。一个函数的声明由
func
关键字、函数名、参数列表、返回值列表(上述例子里的main
函数参数列表和返回值都是空的)以及包含在大括号里的函数体组成。Go语言不需要在语句或者声明的末尾添加分号,除非一行上有多条语句。实际上,编译器会主动把特定符号后的换行符转换为分号,因此换行符添加的位置会影响Go代码的正确解析(比如行末是标识符、整数、浮点数、虚数、字符或字符串文字、关键字
break
、continue
、fallthrough
或return
中的一个、运算符和分隔符++
、--
、)
、]
或}
中的一个)。举个例子,函数的左括号{
必须和func
函数声明在同一行上,且位于末尾,不能独占一行,而在表达式x + y
中,可在+
后换行,不能在+
前换行(以+结尾的话不会被插入分号分隔符,但是以x结尾的话则会被分号分隔符,从而导致编译错误)
其他命令
go clean
go clean 命令是用来移除当前源码包里面编译生成的文件,这些文件包括
- _obj/ 旧的object目录,由Makefiles遗留
- _test/ 旧的test目录,由Makefiles遗留
- _testmain.go 旧的gotest文件,由Makefiles遗留
- test.out 旧的test记录,由Makefiles遗留
- build.out 旧的test记录,由Makefiles遗留
- *.[568ao] object文件,由Makefiles遗留
- DIR(.exe) 由 go build 产生
- DIR.test(.exe) 由 go test -c 产生
- MAINFILE(.exe) 由 go build MAINFILE.go产生
go test
go test 命令,会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件。默认的情况下,不需要任何的参数,它会自动把你源码包下面所有test文件测试完毕,当然你也可以带上参数,详情请参考go help testflag
go doc
go doc 命令其实就是一个很强大的文档工具。
如何查看相应package的文档呢? 例如builtin包,那么执行go doc builtin;如果是http包,那么执行go doc net/http;查看某一个包里面的函数,那么执行go doc fmt Printf;也可以查看相应的代码,执行go doc -src fmt Printf;
1 | 查看net/http包 |
通过命令在命令行执行 go doc -http=:端口号,比如godoc -http=:8080。然后在浏览器中打开127.0.0.1:8080,你将会看到一个golang.org的本地copy版本,通过它你可以查询pkg文档等其它内容。如果你设置了GOPATH,在pkg分类下,不但会列出标准包的文档,还会列出你本地GOPATH中所有项目的相关文档,这对于经常被限制访问的用户来说是一个不错的选择。
1 | godoc -http=:9527 |
go fix 用来修复以前老版本的代码到新版本,例如go1之前老版本的代码转化到go1
go version 查看go当前的版本
go env 查看当前go的环境变量
go list 列出当前全部安装的package
gofmt
和goimports
的配置
Go语言在代码格式上采取了很强硬的态度。gofmt
工具把代码格式化为标准格式(这个格式化工具没有任何可以调整代码格式的参数,Go语言就是这么任性),并且go
工具中的fmt
子命令会对指定包,否则默认为当前目录中所有.go源文件应用gofmt
命令。我们应该养成格式化自己的代码的习惯。以法令方式规定标准的代码格式可以避免无尽的无意义的琐碎争执导致了Go语言的TIOBE
排名较低,争议的话题较少。更重要的是,这样可以做多种自动源码转换,如果放任Go语言代码格式,这些转换就不大可能了。
很多文本编辑器都可以配置为保存文件时自动执行gofmt
,这样源代码总会被恰当地格式化,gofmt
包含在标准的分发包中。还有个相关的工具,goimports
,可以根据代码需要,自动地添加或删除import
声明。这个工具并没有包含在标准的分发包中,可以用下面的命令在在goland
中在任意一个项目的终端执行:
1 | $ go get -v golang.org/x/tools/cmd/goimports |
进入GOPATH
(Go语言安装目录),执行以下命令安装goimports
,没有加版本号会报错
1 | go install golang.org/x/tools/cmd/goimports@latest |
至此,我们可以在 GOPATH/bin
目录下看到 goimports.exe
然后在goland
的设置中点击工具>File Watcher
添加gofmt
和goimports
goimports.exe
在GOPATH/bin
目录下,其实goland
能够自动找到它
点击确定,gofmt
和goimports
配置成功