一个golang小白使用vscode搭建Ununtu20.04下的go开发环境

前言

先交代一下背景,距离正式接触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.sumgo.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
alberts@home-pc:~$ wget https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz
--2024-01-21 17:22:11-- https://golang.google.cn/dl/go1.19.linux-amd64.tar.gz
Resolving golang.google.cn (golang.google.cn)... 203.208.50.34
Connecting to golang.google.cn (golang.google.cn)|203.208.50.34|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://dl.google.com/go/go1.19.linux-amd64.tar.gz [following]
--2024-01-21 17:22:12-- https://dl.google.com/go/go1.19.linux-amd64.tar.gz
Resolving dl.google.com (dl.google.com)... 220.181.174.161, 2401:3800:4001:807::1001
Connecting to dl.google.com (dl.google.com)|220.181.174.161|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 148796421 (142M) [application/x-gzip]
Saving to: ‘go1.19.linux-amd64.tar.gz’

go1.19.linux-amd64.tar.gz 100%[==============================>] 141.90M 3.62MB/s in 31s

2024-01-21 17:22:43 (4.54 MB/s) - ‘go1.19.linux-amd64.tar.gz’ saved [148796421/148796421]

解压go压缩包完成安装

go的运行环境直接解压拷贝到指定位置就可以了,我把go解压安装到了 /usr/local/go 目录,解压之前也清理掉老的目录,如果之前没安装过,rm这条命令可以不使用

1
2
3
sudo su
rm -rf /usr/local/go
tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz

配置环境变量

这一步有点类似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
    2
    alberts@home-pc:~$ go version
    go version go1.19 linux/amd64

查看版本显示出 go1.19 linux/amd64, 至此go语言的基础开发环境就配置好了

编写一个helloword程序

1
2
3
4
5
6
7
8
9
alberts@home-pc:/mnt/g$ mkdir wlsworkspace
alberts@home-pc:/mnt/g$ cd wlsworkspace
alberts@home-pc:/mnt/g/wlsworkspace$ mkdir hello
alberts@home-pc:/mnt/g/wlsworkspace$ cd hello/
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go mod init github.com/alberts/go/hello
go: creating new go.mod: module github.com/alberts/go/hello
alberts@home-pc:/mnt/g/wlsworkspace/hello$ touch hello.go
alberts@home-pc:/mnt/g/wlsworkspace/hello$ ls
go.mod hello.go

打开 hello.go 文件编写以下内容:

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("Hello,World!")
}

保存文件后使用 go run 命令运行

1
2
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go run hello.go
Hello,World!

安装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
2
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go get -v golang.org/x/tools/gopls
go: module golang.org/x/tools/gopls: Get "https://proxy.golang.org/golang.org/x/tools/gopls/@v/list": dial tcp 142.251.42.241:443: connect: connection refused

直接安装通常会因无法下载而失败,需要修改代理来改变下载地址

修改代理并重新安装依赖包

1
2
3
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go env -w GO111MODULE=on
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go env -w GOPROXY=https://goproxy.cn,direct
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go env -w GOSUMDB="sum.golang.org"

安装依赖包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
alberts@home-pc:/mnt/g/wlsworkspace/hello$ go get -v golang.org/x/tools/gopls
go: downloading golang.org/x/tools v0.17.0
go: downloading golang.org/x/tools/gopls v0.14.2
go: downloading golang.org/x/tools v0.14.1-0.20231114185516-c9d3e7de13fd
go: downloading golang.org/x/telemetry v0.0.0-20231114163143-69313e640400
go: downloading github.com/sergi/go-diff v1.1.0
go: downloading honnef.co/go/tools v0.4.5
go: downloading mvdan.cc/gofumpt v0.4.0
go: downloading mvdan.cc/xurls/v2 v2.4.0
go: downloading golang.org/x/mod v0.14.0
go: downloading golang.org/x/sync v0.4.0
go: downloading golang.org/x/text v0.13.0
go: downloading golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338
go: downloading golang.org/x/sys v0.14.0
go: downloading golang.org/x/vuln v1.0.1
go: downloading github.com/google/go-cmp v0.5.9
go: downloading github.com/BurntSushi/toml v1.2.1
go: added github.com/BurntSushi/toml v1.2.1
go: added github.com/google/go-cmp v0.5.9
go: added github.com/sergi/go-diff v1.1.0
go: added golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338
go: added golang.org/x/mod v0.14.0
go: added golang.org/x/sync v0.4.0
go: added golang.org/x/sys v0.14.0
go: added golang.org/x/telemetry v0.0.0-20231114163143-69313e640400
go: added golang.org/x/text v0.13.0
go: added golang.org/x/tools v0.14.1-0.20231114185516-c9d3e7de13fd
go: added golang.org/x/tools/gopls v0.14.2
go: added golang.org/x/vuln v1.0.1
go: added honnef.co/go/tools v0.4.5
go: added mvdan.cc/gofumpt v0.4.0
go: added mvdan.cc/xurls/v2 v2.4.0

这次安装成功了,这些依赖包默认安装到了 ~/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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Tools environment: GOPATH=/home/alberts/go
Installing 6 tools at /home/alberts/go/bin in module mode.
gopkgs
go-outline
dlv
dlv-dap
staticcheck
gopls

Installing github.com/uudashr/gopkgs/v2/cmd/gopkgs (gopkgs) SUCCEEDED
Installing github.com/ramya-rao-a/go-outline (go-outline) SUCCEEDED
Installing github.com/go-delve/delve/cmd/dlv (dlv) SUCCEEDED
Installing github.com/go-delve/delve/cmd/dlv@master (/home/alberts/go/bin/dlv-dap) SUCCEEDED
Installing honnef.co/go/tools/cmd/staticcheck (staticcheck) SUCCEEDED
Installing golang.org/x/tools/gopls (gopls) SUCCEEDED

All tools successfully installed. You are ready to 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

当前工作目录下有 basehello 两个包含go.mod的工程,使用 go work init 命令可以初始化一个工作空间

1
2
3
4
5
6
7
8
9
10
alberts@home-pc:/mnt/g/wlsworkspace$ ls
base hello
alberts@home-pc:/mnt/g/wlsworkspace$ go work init base hello
alberts@home-pc:/mnt/g/wlsworkspace$ cat go.work
go 1.19

use (
./base
./hello
)

初始化之后工程之间就可以相互引用彼此对外的包内容了

总结

  • 下载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

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

放下助人情节,尊重他人命运~

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客