Golang语法基础1-背景与初探
1. 起源与发展
Go/Golang 起源于2007年,并于2009年正式对外发布,是一个完全开源的项目,背后的支持者是谷歌公司,核心设计者是三位著名IT工程师:Ken Thompson,Rob Pike,Robert Griesemer。分别是如下从左到右三位
其中 Ken Thompson 是 Unix 操作系统的设计者,并因此获得图灵奖,也是C语言前身B语言的设计者,UTF-8 编码设计者之一,计算机史的重要人物,2006年加入谷歌,和另外两人一起设计了Go语言。 Rob Pike 是 Ken 的老搭档。
随后又有 lan Lance Taylor 和 Russ Cox 两人加入团队,前者是 gccgo 编译器的作者和 cgo工具链的维护者,后者加入团队后着手Go语言标准库的开发。下图分别是他们两个
Go语言以囊地鼠(Gopher)为图标和吉祥物,这是一种原产于加拿大的啮齿类动物,Go语言开发者也一般自称为 Gopher。下图中左边是囊地鼠,右边是 Go logo.
Go语言相比于其它语言的最大优势在于它的执行性能与开发效率,这得益于Go在并发编程、内存回收等许多方面的良好设计,并因此大规模用于服务器编程、网络编程、数据库和云平台领域。
比较出名的Go语言项目有(不限于这些)
- Go语言本身: https://github.com/golang/go
- Docker: https://www.docker.com/
- kubernetes: https://github.com/kubernetes/kubernetes
- Ethereum: https://github.com/ethereum/go-ethereum
- fabric: https://github.com/hyperledger/fabric
- Hugo: https://github.com/gohugoio/hugo
- TiDB: https://github.com/pingcap/tidb
- InfluxDB: https://github.com/influxdata/influxdb
- ETCD: https://github.com/etcd-io/etcd
使用Go的国外公司有:Google, Docker, NetFlix, CloudFlare, Dropbox, MongoDB, Uber等
使用Go的国内公司有:七牛、字节跳动、bilibili、京东、百度,其它公司如小米、腾讯、阿里等也都在使用Go,但可能不是主力
2. 跟踪最新动态
最直接的方式是跟踪Go语言的源码库,关注提交历史和issue
- 原始代码库: https://go.googlesource.com/go
- github镜像: https://github.com/golang/go
其它活跃论坛或动态
- golang-dev:Google邮件列表的Go开发组讨论区
- golang-nuts:Google邮件列表的Go讨论社区
- golang-announce:发布Go版本或Go开发的最新状态
- go.dev:刚刚上线(2019.11.14)的Go开发人员中心
- gotime:Go的一个播客,每周一更,内容有干货
- @golang:Go 语言在 Twitter 的官方帐号
此外还有每年举办的几个大会
- Gopher Con,举办地在美国,时间不定,今年在7月,2020年会在6月份举行。会议总结
- GopherChina,举办地在中国,每年4月份。会议总结
- dotGo,举办地在欧洲,每年3月份
- 详细的会议列表可查看 https://github.com/golang/go/wiki/Conferences
Go 下载地址和相关的文档、标准库等访问地址为
- 官网 https://golang.org/
- 国内的镜像网站 https://golang.google.cn/
Go语言中文网 是国内最活跃的Go社区,每周会发行一份Go语言爱好者周刊
Go相关资料聚集最多的还是go wiki
3. 下载安装
Windowns下快速安装可以使用 chocolatey ,执行如下命令即可
|
|
自动配置环境变量,安装完重启终端即可使用。下面开始介绍常规的安装方法,以win10和Ubuntu为例。
3.1 下载
Golang中国官网下载页面为 golang.google.cn/dl,为windows,macOS和Linux三种环境都提供了安装包。
windows默认下载文件为go1.14.windows-amd64.msi
,双击启动即可安装,默认安装位置为C:\Go
,环境变量将自动设置。但如果下载了以.zip
为后缀的版本,则需要自己解压到合适的路径,并自己设置环境变量。
Linux默认下载文件为go1.14.linux-amd64.tar.gz
,将其解压缩到/usr/local
,然后手动将/usr/local/go/bin
添加到 PATH 环境变量中。
3.2 安装
windows
msi
后缀的安装版本双击安装,环境变量将会自动设置,打开powershell,使用go env
命令查看环境变量
|
|
使用 go version
查看版本同时验证安装
|
|
Linux
以Ubuntu 20.04 LTS 为例说明,首先在 golang.org/dl 页面右击要下载的版本获取下载链接,使用wget下载文件。也可以直接下载。
|
|
将文件解压缩到指定目录/usr/local,-C
参数用于指定目标文件夹,解压缩后删除压缩文件。
|
|
查看安装目录
|
|
设置环境变量
|
|
更新的环境变量可以通过下面的命令使其直接生效
|
|
Linux 全部环境变量如下
|
|
注:将环境变量添加到/etc/profile可使go全局启用,也可添加到$HOME/.profile,对当前登录用户起作用。
注:可以使用apt-get命令安装,但安装的go不会是最新版本,同样,也可以使用snap安装,可以安装最新版本。
3.3 环境变量说明
常规的使用除了GOPATH外无需关心其它环境变量,但在进行交叉编译时,需要进行一定的设置,详细的环境变量说明可以查看 $GOPATH environment variable set correctly,以下解释几个主要的环境变量。
GOOS
与GOARCH
:目标操作系统和处理器架构,GOHOSTOS
和GOHOSTARCH
是宿主机操作系统和处理器架构。GOBIN
:编译器和链接器的安装位置,默认是$GOROOT/bin
,一般将其设置为空值,Go会使用默认值。GOROOT
:电脑上安装的Go的根目录,Linux下一般为$HOME/go
,windows下为C:\go
GOPATH
:go install、go get等命令默认路径都是GOPATH
,是编译后二进制文件的存放目的地、下载后包的存放路径以及 import 包时的搜索路径
我们需要关心的唯一一个环境变量是GOPATH,可以看到,默认的GOPATH是c:\Users\lylw1\go
,其中lylw1
是自己的用户名。
GOPATH 所代表的路径是 go 的工作区,可以选择任意自己喜欢的文件夹作为go的工作区,如果不想使用默认的路径,需要自己进行修改,使用 go env
命令
|
|
更多的环境变量修改方式可以查看Setting GOPATH,需要注意的一点是GOPATH不能设置为Go的安装目录C:\go
3.4 安装目录清单
安装完成的Go根目录($GOROOT)文件夹结构除了README.md,AUTHORS,LICENSE等常规文件外,基本结构应如下所示:
/bin
:包含可执行文件,如:编译器,Go 工具/doc
:包含示例程序,代码工具,本地文档等/lib
:包含文档模版/misc
:包含与支持 Go 编辑器有关的配置文件以及 cgo 的示例/pkg/os_arch
:包含标准库的包的对象文件(.a
)/src
:包含源代码构建脚本和标准库的包的完整源代码(Go 是一门开源语言)/src/cmd
:包含 Go 和 C 的编译器和命令行脚本
这是之前的介绍,网上搜到的多是这个说明,但当前还多了api
和test
两个文件夹。
3.5 代码目录结构
Go 1.13之前,所有代码在一个工作区,Go 1.13及之后,使用 Go module 进行管理,项目代码不再必须放到 GOPATH 下。本文假设使用 Go 1.13 及以后的版本。对于之前的方式不再介绍。
Go 程序以包(package)的形式进行组织,一个包就是一个目录,该目录下可能有一个或多个源文件,同一个包的所有代码会被一起编译。另外,同一个包中定义的变量、常量、类型、函数,即使在不同的源文件中,也可以相互访问。
Go 项目以模块的方式进行组织,模块(module)是一组相关包的集合。一个项目通常是一个仓库(repository),而一个 Go 仓库(repository)只能包含一个模块,但可导入使用多个其它模块,仓库根目录下的 go.mod
文件用来声明这些导入模块的路径。和 go.mod
文件一起位于仓库根目录的是一个一个的子目录,每个子目录可能是一个包,也可能是一个子模块,是否为子模块要看子目录下是否存在 go.mod
文件。
值得注意的是,尽管项目代码以仓库的方式进行组织,但在编写完成构建之前,代码不需要上传到云端,模块可以本地存在,仓库形式仅仅是因为我们总有一天会将代码上传到云的。
模块的路径不仅作为导入路径,同样也说明了模块的下载路径,比如 golang.org/x/tools
, Go 命令将知道从 https://golang.org/x/tools
去下载它。包的导入路径是模块路径 + 包名,比如,模块 github.com/google/go-cmp
包含一个包(子目录)cmp
,这个包的导入路径就是 github.com/google.go-cmp/cmp
。Go 的标准库导入不需要模块路径前缀,可以仅使用包名。
最后,所有的模块都会下载到 GOPATH 的 pkg/mod
目录下,并被所有项目共享,因此,模块代码是只读的。
本部分说明可以阅读第二篇文章后再来看。
4. 第一个程序
编辑并运行我们的第一个程序,按照编程界的惯例,输出hello, world!
。
首先创建项目文件夹并初始化模块,模块路径自行选择
|
|
然后在该目录下创建hello.go
文件,使其包含如下代码
|
|
使用go install
命令编译安装
|
|
该命令会编译程序并产生一个二进制包,然后将该二进制包安装到 $HOME/go/bin/hello
,如果是 Windows,会安装到 %USERPROFILE%\go\bin\hello.exe
。
安装目录受 GOPATH 和 GOBIN 影响,如果 GOBIN 被设置,则二进制包会被安装到设置的目录,如果 GOPATH 被设置,二进制包将按照到 GOPATH 列表的第一个目录的 bin 子目录,如果都没有被设置,就会安装到默认 GOPATH 的 bin 子目录($HOME/go
or %USERPROFILE%\go
)。
go install
命令执行需要在仓库根目录下,且下面三个命令是等效的
|
|
将$GOPATH/bin
添加到电脑的PATH
环境变量中,这样可以直接执行
|
|
可能是因为我使用chocolatey安装的原因,这一环境变量也已经自动设好了,所以我可以直接执行命令。
完成编辑后,就可以使用版本控制工具初始化仓库并上传代码了,示例如下(这一步不是必须的)
|
|
一种最方便的方式是将模块路径与仓库路径匹配,比如将以上模块声明为 github.com/username/hello
,多数版本控制服务商都支持这种格式。
5. 编辑器/IDE
Golang 开发最流行的两个工具是 Goland 和 VScode,我自己是 VScode 的使用者。除了这两个工具外,官方还提供了一份IDE和插件列表。
VScode 中的 Go 扩展提供了大量的特性,如自动补全、悬停信息显示、括号匹配等,原本属于第三方开发者维护,现在交给了 Go 团队。详细的特性说明查看官网,下面进行一些简单介绍。
5.1 Go工具链
微软在开发 VS Code 过程中, 定义了一种协议: 语言服务器协议 ,用来为每种语言提供诸如自动完成,代码提示等功能。gopls 就是Go语言的服务器, 安装命令为
|
|
事实上,编辑 Go 代码时如果没有安装,VScode 会在右下角弹出提示,只要直接点击 Install
即可,不需要自己输入命令。同时,因为没有设置go.toolsGopath,默认使用了 GOPATH 作为安装路径
|
|
Go代码的调试需要 delve 工具
|
|
除此之外,还有一批需要安装的分析工具,如下
|
|
所有这些工具只需要在右下角弹出提示后点击 Install
即可
不过上述提到的很多插件不翻墙都无法下载,可以自己手动到github下载然后解压到GOPATH/src
,建立起对应的目录结构,然后运行go install
将其安装
微软设置了默认的代理服务器,现在(2020.03.18)所有插件均可在不翻墙的情况下顺利安装,而且速度很快
5.2 用户和工作区设置
使用 VScode 需要关心的一个重要部分是用户和工作区设置,几乎所有的事情都和它们有关。
这是两种不同的设置范围
- 用户设置:是一个全局的设置,适用于打开的任何VScode窗口
- 工作区设置:如题,项目工作区的设置,只适用于对应的工作区
工作区的设置会覆盖掉用户设置,它针对具体的项目,配置文件位于项目根目录.vscode
文件夹,可与其它开发者共享。.vscode
文件夹还用于存放调试配置和任务配置。
点击左下角的齿轮,选择设置
,默认的设置界面如上,是一个可视化的界面,不过也可以使用settings.json
配置文件
- 用户设置文件在windows中位于
%APPDATA%\Code\User\settings.json
- 工作区设置文件位于根目录的
.vscode
文件夹中
最后,VScode大量的操作都可以通过命令完成,使用快捷键Ctrl+Shift+P
可以打开命令输入框。
5.3 特性说明
在用户或工作区设置中,将 go.autocompleteUnimportedPackages
设为true
,可以在代码中点击包名跳转查看包的具体内容。
鼠标悬停在变量、函数和结构体的名称上方可以查看它们的签名等信息,这一功能由前面安装的godef
工具实现,同样可完成这一功能的工具还有godoc
和gogetdoc
,通过在用户或工作区设置中调整go.docsTool
来切换工具。
代码导航功能无需设置默认实现。
对源码的保存操作会自动触发格式化、编译和代码质量检查。格式化工具为gofmt
,可选的替代工具有goreturns
和goimports
,在用户或工作区设置中调整go.formatTool
来设置。编译的过程使用go build
命令。代码质量检查的工具为golint
,也可以使用gometalinter
,用来检查代码的规范性,检查得到的errors
和warning
会在编辑器里以红色/绿色波浪线标出来,下面的输出窗口也会显示详细信息。
所有可选的替代工具都需要自己安装,使用快捷键打开命令面板,输入 Go: Install/Update Tools
,选择要安装的工具,点击确定即可。
5.4 使用
调试使用的是前面安装的delve
工具。在 VScode 中,按F5
启动调试,一般情况下使用默认的调试配置即可,不过还是应当对调试配置选项有一定的了解。
默认是没有调试配置文件的,当我们需要进行配置时,输入命令 Debug: Open launch.json
,第一次会在工作区根目录的.vscode
文件夹中创建launch.json
文件,文件中默认的配置信息如下
|
|
可设置的配置属性可查看Debugging Go code using VS Code,更多关于VScode中Go调试的相关信息都可查看该文档。
这里需要注意的是args
,调试时程序需要传入的参数数组是该配置参数的值
运行程序使用快捷键Ctrl+F5
,和调试使用的是同一个配置文件。