安装Golang
建议去官网下载安装,Homebrew 有时候很好用,不过有可能更新不及时,或者它自己无法更新,遇到问题还得再查,没必要。
Go官网下载地址:https://golang.org/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/
注意 Windows 和 Mac 系统使用安装包安装完成后会自动在环境变量里添加 GOROOT和 GOPATH(老版本的GOLANG不会自动添加GOPATH),我们不需要修改,而 Linux 系统需要自己设置。
安装好后检查是否安装成功:
➜ go version
GOLANG环境变量
GOROOT:
golang安装路径。不应改变其默认设置。以windows环境为例,GOROOT默认在C盘根目录,若安装过程中更改其路径,则需要手动再更改环境变量。
GOPATH:
golang工作目录
在 Go 1.8 版本之前,GOPATH 环境变量默认是空的。从 Go 1.8 版本开始,Go 开发包在安装完成后,将 GOPATH 赋予了一个默认的目录,参见下表
GOPATH 在不同平台上的安装路径
平台 | GOPATH默认值 | 举例 |
---|---|---|
windows | %USERPROFILE%/go | C:\Users\用户名\go |
unix | $HOME/go | /home/用户名/go |
自动Golang采用Module的方式管理项目后,GOPATH目录已经不是那么重要了,目前主要用来存放依赖的Module库,生成的可执行文件等。Go语言1.14版本之后推荐使用Go Modules管理,所以我们可以在任何目录里建立Go项目。GOPATH环境变量的配置参考上面的安装Go,配置到/etc/profile或者Windows下的系统变量里。
这个目录我们可以根据自己的设置指定,比如我的Mac在$HOME/code/go下,Window的可以放到d:\code\go下等。该目录下有3个子目录,他们分别是:
.
├── bin
├── pkg
└── src
- bin文件夹存放go install命名生成的可执行文件,可以把$GOPATH/bin路径加入到PATH环境变量里,就和我们上面配置的$GOROOT/bin一样,这样就可以直接在终端里使用我们go开发生成的程序了。(自动生成)
- pkg文件夹是存在go编译生成的中间缓存文件。(自动生成)
- src存放的是非Go Module项目源代码。(用户手动创建)
VS CODE配置GO环境
GO语言开发环境GOLAND需要付费,这里以免费的VSCODE为例:
配置代理
由于官方地址国内访问不了,所以我们先配置代理,这样才能下载插件和依赖。
执行命令:go env -w GOPROXY=https://goproxy.io,direct
安装 VsCode golang插件
在插件列表里搜索 Go,安装即可。
由于1.14版本之后推荐使用Go Modules管理,我们便不在GOPATH中存放工程路径。但是需要先开启MODULE模式,在终端输入go env -w GO111MODULE=on
GO111MODULE=off 禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
GO111MODULE=on 启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。
源代码工程直接在windows任意目录下创建都可以,这里以桌面为例。
在桌面上创建一个文件夹,然后用VSCODE打开该文件夹,比如 examples,新建一个 main.go,就会提示安装 Go tools,点击安装(install all)。如果不配置代理,一般情况是超时无法安装,我们配置代理后一般都能安装成功。安装的文件系统默认都放在GOPATH中。
在VSCODE的终端中初始化 Go Modules,输入:go mod init {项目名}
比如:
➜go mod init my_hello
go: creating new go.mod: module my_hello
包含go.mod文件的目录也被称为模块根,也就是说,go.mod 文件的出现定义了它所在的目录为一个模块。
第一个GO程序
在 main.go 里输入:
package main
import (
"fmt"
)
func main() {
fmt.Println("hello", "world")
}
然后按F5即可运行。也可以打断点调试
GOLANG MODULE
常用
go mod init:初始化go mod, 生成go.mod文件,后可接参数指定 module 名
go mod download:手动触发下载依赖包到本地cache(默认为$GOPATH/pkg/mod目录)
go list -m -json all:以 json 的方式打印依赖详情
go mod tidy :添加缺少的包,且删除无用的包
不常用
go mod graph: 打印项目的模块依赖结构
go mod verify :校验模块是否被篡改过
go mod why: 查看为什么需要依赖
go mod vendor :导出项目所有依赖到vendor下
go mod edit :编辑go.mod文件
EXAMPLE
在文件夹下新建文件test.go
package main
import (
"fmt"
log "github.com/sirupsen/logrus"
)
func main() {
fmt.Println("Hello World")
log.WithFields(log.Fields{
"animal": "walrus",
}).Info("A walrus appears")
}
VSCODE编辑GO代码有一点需要注意,如果代码中没有使用相应的依赖项的import,强行在import中增加,保存.go代码不会成功。反之,如果代码使用了相应的依赖项的代码,则在import中删除,保存.go代码也不会成功。
对于test.go,如果在vscode中直接编译或者运行,系统会提示错误,package test is not in GOROOT (C:\Program Files\Go\src\test)
因为对于本例而言,import中的依赖项还没有加到go.mod和go.sum中(sum文件还没生成)
其实在执行go mod init xxx时,系统已经提示:
go: creating new go.mod: module testlearn
go: to add module requirements and sums:
go mod tidy
所以输入go mod tidy
go自动下载需要的模块和子模块(下载到GOPATH的pkg目录下)。并完善go.mod文件,生成go.sum文件。
之后再编译或运行程序,才能成功。
另外,go可执行程序的入口函数是main,不能改成其他名字。
PS:更新mod的各命令使用场景:
go build
go get
go install
go mod download
go mod tidy
Go 1.16 版本中包含着大量的 Modules 相关的更新,详细内容可直接查看其 Release Note。整体而言,包含以下要点:
- GO111MODULE 默认为 on ,如果要恢复到之前的行为,则需要将 GO111MODULE 设置为 auto ,这样差不多意味着 GOPATH 模式要逐步淡出人们的视野了;
- go install 命令可以接受一个版本后缀了,(例如,go install sigs.k8s.io/kind@v0.9.0),并且它是在模块感知的模式下运行,可忽略当前目录或上层目录的 go.mod 文件。这对于在不影响主模块依赖的情况下,安装二进制很方便;
- 在将来,go install 被设计为“用于构建和安装二进制文件”, go get 则被设计为 “用于编辑 go.mod 变更依赖”,并且使用时,应该与 -d (下载)参数共用,在将来版本中 -d 可能会默认启用;
- go build 和 go test 默认情况下不再修改 go.mod 和 go.sum。可通过 go mod tidy(适合新手) ,go get 或者手动完成;
总结:
1.代码中import中的库,直接用go mod tidy自动更新即可。也可以手动修改go.mod文件。
2.go install不会修改go.mod文件了,使用go install时需要注意,在模块外,不带 @version 是无法安装的,会有如下错误:
(MoeLove) ➜ go install -v sigs.k8s.io/kind
go install: version is required when current directory is not in a module
Try 'go install sigs.k8s.io/kind@latest' to install the latest version
如果你在模块目录中,并且你不带 @version 执行安装的话,等价于读取go.mod,并安装 go.mod 中已经包含的版本,不能安装未出现在 go.mod 中的包。
3.go get 的行为就等同于我们现在执行 go get -d 命令了,仅需下载源码,并将依赖添加至 go.mod 即可。(-d表示下载)
参考链接:
https://www.cnblogs.com/wongb...
https://segmentfault.com/a/11...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。