前言
先交代一下背景,距离正式接触golang这门语言已经有5年时间,平时偶尔也会用go写写工具和功能,但其实充其量就是语言小白,基本上就是按照教程配置好环境,按照需求写写逻辑,能跑起来就行了。golang随着这几年的变化,这门语言的变化还是非常大的,之前写过一篇《Go环境配置时遇到的GOPATH路径以及包管理问题》,可以看出之前配置的变量很像Java早期的配置环境,从1.11 版本之后go工程不必放到 GOPATH
路径中了,通过go.mod文件来标记并跟踪每个软件包的版本,灵活度大大提高,从此 GOPATH
概念逐渐淡化,在1.18版本新引入一个新功能go.work
,它被设计为解决在同一工作空间中处理多个模块的问题,使得go工程的模块管理更加方便。
简单描述下我的开发环境,Windows10
+ VSCode1.58.0
+ WLS1.0 - Ubuntu20.04
,平时工作都是在Ubuntu上,习惯了在Linux上的开发,所以即使是自己家的电脑也安装了子系统,就当成Ubuntu
来用就行了,Vscode安装在Windows上,直接连接到子系统上进行代码编写,以上是前提,本文的重点是在Ubuntu20.04系统上安装go的编译和运行环境。
搭建go环境
我选择的go版本是1.19,已经支持 go.sum
和 go.work
,同时也为了和工作开发保持一致,没必要用太新的特性,现在的go包管理已经不想早期的Java,不再依赖 GOPATH
,和 Python3.x 更像了,只管下载包然后在各自的工程目录下使用就行了,必要时需要指定使用库的版本。
下载go安装包
go语言的官网是 https://golang.google.cn/dl/,下载1.19版本的Linux包go1.19.linux-amd64.tar.gz,这个网址通常下载很慢,可以改为go语言中文网https://studygolang.com/dl来下载1.19版本go1.19.linux-amd64.tar.gz
可以通过浏览器下载拷贝到指定位置,也可以通过wget
命令下载
1 | alberts@home-pc:~$ wget https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz |
解压go压缩包完成安装
go的运行环境直接解压拷贝到指定位置就可以了,我把go解压安装到了 /usr/local/go
目录,解压之前也清理掉老的目录,如果之前没安装过,rm
这条命令可以不使用
1 | sudo su |
配置环境变量
这一步有点类似Windows中的修改注册表,我安装了新的程序,需要通知系统当使用 go
命令时需要去哪个目录下寻找可执行程序,具体操作如下
使用vim编辑.bashrc文件
1
alberts@home-pc:~$ vim ~/.bashrc
到文件的末尾添加以下代码
1
alberts@home-pc:~$ export PATH=$PATH:/usr/local/go/bin
重新加载配置文件
1
alberts@home-pc:~$ source ~/.bashrc
查看版本是否安装成功
1
2alberts@home-pc:~$ go version
go version go1.19 linux/amd64
查看版本显示出 go1.19 linux/amd64
, 至此go语言的基础开发环境就配置好了
编写一个helloword程序
1 | alberts@home-pc:/mnt/g$ mkdir wlsworkspace |
打开 hello.go
文件编写以下内容:
1 | package main |
保存文件后使用 go run
命令运行
1 | alberts@home-pc:/mnt/g/wlsworkspace/hello$ go run hello.go |
安装VSCode插件
安装智能提示插件
为了编写go代码方便,可以安装这个名为Go
的插件,这个插件不是必须安装的,但是你在写go代码时VSCode会自动提示你安装这个插件,为了实现Go语法只能提醒,我们可以直接点击提示安装,或者在插件市场里搜索安装
go插件
插件安装完成后会提示下面的报错
The “gopls” command is not available. Run “go get -v golang.org/x/tools/gopls” to install.
说明安装这个插件需要依赖 golang.org/x/tools/gopls
这个包,我们可以根据提示安装
安装go依赖包
1 | alberts@home-pc:/mnt/g/wlsworkspace/hello$ go get -v golang.org/x/tools/gopls |
直接安装通常会因无法下载而失败,需要修改代理来改变下载地址
修改代理并重新安装依赖包
1 | alberts@home-pc:/mnt/g/wlsworkspace/hello$ go env -w GO111MODULE=on |
安装依赖包
1 | alberts@home-pc:/mnt/g/wlsworkspace/hello$ go get -v golang.org/x/tools/gopls |
这次安装成功了,这些依赖包默认安装到了 ~/go/pkg
目录下,使用时直接在go文件中引用就行了 import golang.org/x/sys
以上这些包是Go语言的依赖管理工具,它们的作用如下:
- golang.org/x/tools: 提供了一系列用于开发Go语言的工具,如gopls等
- golang.org/x/tools/gopls: 是一个基于Go语言的代码补全和导航工具,它可以帮助开发者更高效地编写和调试Go代码
- golang.org/x/telemetry: 提供了一套用于收集和分析应用程序性能数据的库
- github.com/sergi/go-diff: 是一个用于比较两个Go源代码文件差异的工具
- honnef.co/go/tools: 提供了一些用于处理Go源代码的工具,如goimports(自动导入缺失的包)等
- mvdan.cc/gofumpt: 是一个用于格式化Go源代码的工具,它可以自动调整代码格式以符合Go语言的最佳实践
- mvdan.cc/xurls/v2: 是一个用于解析URL的库,它可以将URL分解为各个组成部分,方便开发者处理
- golang.org/x/mod: 是一个用于管理Go模块的库,它可以帮助你更好地组织和管理项目的依赖关系
- golang.org/x/sync: 提供了一组同步原语,如互斥锁、条件变量等,用于实现多线程编程中的同步机制
- golang.org/x/text: 提供了一个用于处理Unicode文本的库,它可以帮助你更方便地处理和操作文本数据
- golang.org/x/exp/typeparams: 提供了一个用于处理类型参数的库,它可以帮助你更方便地处理泛型编程中的类型参数问题
- golang.org/x/sys: 提供了一个用于访问操作系统功能的库,它可以帮助你更方便地处理操作系统相关的任务
- golang.org/x/vuln: 提供了一个用于管理已知安全漏洞的库,它可以帮助你更容易地识别和修复项目中的安全漏洞
- github.com/stamblerre/gocode: 提供Go语言的代码自动补全功能,用于IDEs和编辑器
- github.com/uudashr/gopkgs/v2/cmd/gopkgs: 命令行工具,帮助发现和使用Go语言软件包
- github.com/ramya-rao-a/go-outline: VSCode插件,为Go源代码文件生成结构大纲以便于导航
总结一下需要安装的依赖包
go get -v golang.org/x/tools/gopls
go get -v github.com/stamblerre/gocode
go get -v github.com/uudashr/gopkgs/v2/cmd/gopkgs
go get -v github.com/ramya-rao-a/go-outline
根据VSCode提示安装后续的Tools,得到的控制台输出信息如下
1 | Tools environment: GOPATH=/home/alberts/go |
go.mod 和 go.work
go.mod
Go语言从1.11版本开始引入了Go Modules,这个版本之后不再需要将项目放到GOPATH中。
Go Modules是Go语言的依赖管理工具,它改变了之前必须使用GOPATH来管理依赖的模式。在Go 1.11及之后的版本中,通过go.mod文件来标记并跟踪每个软件包的版本,这意味着开发者可以在任何地方创建项目,而不必遵循GOPATH目录结构。
此外,Go团队还增加了一个环境变量GO111MODULE
来控制模块支持的启用和禁用。这个环境变量的命名中的”111”象征着它是在Go 1.11版本中引入的。
总的来说,Go语言自1.11版本起,通过引入Go Modules,使得开发者不再受限于GOPATH,可以更加灵活地管理项目和依赖。这一变化被广泛认为是Go语言发展中的一个重大改进。
go.work
“go.work” 是Go 1.18版本新引入的一个功能,它被设计为解决在同一工作空间中处理多个模块的问题。在之前的版本中,开发者常常会遇到路径问题、版本冲突问题等挑战。为了应对这些情况,他们可能需要对每个模块的go.mod文件进行手动修改,过程繁琐且容易出错。
“go.work”文件的主要作用就是来解决这些问题。它是一个特殊的文件,其中包含了use和replace指令,这些指令会覆盖工作区目录下的每个Go Module的go.mod文件中的内容。因此,开发者无需再对每个Go Module的go.mod文件进行手动修改,极大地简化了操作流程并提高了效率。
此外,”go.work”文件的优先级高于go.mod文件中的定义。也就是说,如果在go.work和go.mod中同时指定了不同的代码仓库路径,那么go.work中的设置将会被优先采用。这一特性进一步加强了”go.work”文件在依赖管理中的重要性。
小试一下go.work
当前工作目录下有 base
和 hello
两个包含go.mod的工程,使用 go work init
命令可以初始化一个工作空间
1 | alberts@home-pc:/mnt/g/wlsworkspace$ ls |
初始化之后工程之间就可以相互引用彼此对外的包内容了
总结
- 下载go压缩包
wget https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz
- 初始化工程目录hello
go mod init github.com/alberts/go/hello
,包名通常是支持https访问的网络地址 - 初始化工作空间
go work init base hello
,base 和 hello 都是包含go.mod文件的go工程 - 安装依赖包
go get -v golang.org/x/tools/gopls
- 安装依赖包
github.com/stamblerre/gocode
- 安装依赖包
github.com/uudashr/gopkgs/v2/cmd/gopkgs
- 安装依赖包
github.com/ramya-rao-a/go-outline
放下助人情节,尊重他人命运~