此文是我日常使用中随意做的记录,做备忘。
Go安装
Linux安装
下载安装包
wget -P /opt https://golang.google.cn/dl/go1.22.3.linux-amd64.tar.gz
解压
tar -zxvf go1.22.3.linux-amd64.tar.gz -C /usr/local/program-mh/
环境变量
编辑.profile文件vim ~/.profile,在文件末尾增加下面一行,然后保存退出,刷新source ~/.profile。
export PATH=$PATH:/usr/local/program-mh/go/bin
Go mod
模块是Go管理依赖关系的方式。模块是一起发布、版本控制和分发的包的集合。模块可以直接从版本控制存储库或从模块代理服务器下载。
模块由模块路径标识,该路径在go.mod文件中声明,以及有关模块依赖项的信息。模块根目录是包含go.mod文件的目录。
模块中的每个包都是同一目录中一起编译的源文件的集合。包路径是与包含包的子目录连接的模块路径(相对于模块根)。例如:模块"golang.org/x/net"包含目录是 "html"的包. 那么包的路径是 "golang.org/x/net/html"。
创建新module
在$GOPATH/src之外的某个位置创建一个新的空目录,cd到该目录中,然后创建一个新源文件hello.go:
package hello
func Hello() string {
return "Hello, world."
}
在hello_test.go中编写一个测试:
package hello
import "testing"
func TestHello(t *testing.T) {
want := "Hello, world."
if got := Hello(); got != want {
t.Errorf("Hello() = %q, want %q", got, want)
}
}
此时,目录包含一个包,但不包含模块,因为没有go.mod文件。如果我们在/home/gopher/hello中工作,现在运行go test,我们会看到:
$ go test
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
使用go mod init将当前目录设置为模块的根目录,然后再次尝试go test:
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
go: to add module requirements and sums:
go mod tidy
$ go test
PASS
ok example.com/hello 0.090s
到这里已经编写并测试了第一个模块。
go mod init命令编写了一个go.mod 文件:
PS E:\temp\temp-go\hello> cat go.mod
module example.com/hello
go 1.18
添加依赖
Go模块的主要动机是改善使用(即添加对)其他开发人员编写的代码的体验。
导入依赖rsc.io/quote
package hello
import "rsc.io/quote"
func Hello() string {
return quote.Hello()
}
下载依赖rsc.io/quote,下载的模块在本地缓存(在$GOPATH/pkg/mod中):
$ go get rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: added golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: added rsc.io/quote v1.5.2
go: added rsc.io/sampler v1.3.0
现在再次运行测试:
$ go test
PASS
ok example.com/hello 0.125s
我们上面看到的,添加一个直接依赖关系通常也会带来其他间接依赖关系。命令go list -m all列出了当前模块及其所有依赖项:
$ go list -m all
example.com/hello
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/sampler v1.3.0
除了go.mod,go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希值:
$ cat go.sum
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
go命令使用go.sum文件来确保这些模块的未来下载检索到与第一次下载相同的位,以确保您的项目所依赖的模块不会因恶意、意外或其他原因而意外更改。go.mod和go.sum都应该检查到版本控制中。
升级依赖
未完
Go标准库
本文通过在Go标准库官网文档边学习边总结