Software Development Kit
| api | ||
| bin | ||
| doc | ||
| lib | ||
| misc | ||
| pkg | ||
| src | ||
| test | ||
| codereview.cfg | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| PATENTS | ||
| README.md | ||
| SECURITY.md | ||
| VERSION |
# 版本信息
go version # go version go1.20 windows/amd64
# 环境信息
go env
# 运行
go run main.go
go build .\main.go
go build -o xxx.exe .\main.go
# 格式化go源文件并输出到控制台
gofmt .\main.go
# 格式化go源文件并写到y
gofmt -w .\main.go
go version
查看版本
go get
安装依赖
got build、go install
这两个命令是用来编译包和依赖项的。go install 和 go build 在没有附加参数的情况下运行时都将编译当前目录下的包。如果包是 package main,那么 go build 将把生成的可执行文件放在当前目录中。go install 将把它放在 $GOPATH/bin (如果有多个参数将使用 $GOPATH 的第一个参数)下。另外,go install 将在 $GOPATH/pkg 中安装已编译的依赖项。要达到与 go build 相同的效果,可以使用 go build -i。如果包不是 main 包,go install 将会编译包,并安装在 $GOPATH/pkg 中。
go env
go test
基本环境变量
GOROOT,SDK安装目录
PATH,SDK的bin目录
GOPATH,go项目工作目录(确实不太灵活)
go doc
go fmt
go run与go build,build会将依赖和代码构建为exe文件,包含了go环境
go run运行,整个过程是动态的,需要加载go环境
注意事项:
- 源文件以.go为后缀
- 程序入口为main函数
- 代码区分大小写
- 大括号成对出现,且代码块的大括号必须为K&R风格否则编译报错
- Go语句无需手动添加分号,编译器会自动添加,手动添加是可以的
- Go编译器要求源代码中不能存在未使用的变量和包,否则编译时会报错
GoAPI中文文档:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 (studygolang.com)
application programming interface
package main // 声明文件所在的包,每个go文件必须有归属的包
import "fmt" // 依赖的其他包
// 主函数,程序入口
func main() {
fmt.Println("Hello World")
}
命令行参数
package main
import (
"fmt"
"os"
)
func main() {
fmt.Printf("%v\n", os.Args)
for i, k := range os.Args {
fmt.Println(i, k)
}
}
package main
import (
"flag"
"fmt"
)
func main() {
var (
user string
password string
host string
port int
)
flag.StringVar(&user, "u", "root", "用户名")
flag.StringVar(&password, "p", "123456", "密码")
flag.StringVar(&host, "host", "127.0.0.1", "主机地址")
flag.IntVar(&port, "port", 3306, "端口")
flag.Parse()
fmt.Println(user, password, host, port)
//go run main.go -u admin -p admin -host 192.168.1.1 -port 6666
//任何错误都会导致出现-help效果
}
gomod
go mod init modileName
go mod tidy //依赖关系处理
go mod vender //将依赖复制到verdor目录
go list -m all //显示依赖关系
go list -m -json all
go get github.com/Seekload/stringutil
包托管在一个分布式的版本控制系统上,比如Github等,并且是Public的权限
镜像
重启生效
需要区分 goroot
gopath
gomod
GOROOT:Go 安装路径,GOROOT/src 中为标准库
GOPATH:默认为安装用户目录下的 go 文件夹,GOPATH/src 中存储三方库,import 包查找时,先查找GOROOT再查找GOPATH
所有项目共享 GOPATH,GOPATH中同一个三方库仅可存在一个版本,当多项目使用同一三方库的不同版本时GOPATH无法解决该场景
GOVENDOR
Go 1.5 引入 go vendor 功能,用于解决 GOPATH 的问题,GO15VENDOREXPERIMENT=1,解决的思路就是,在每个项目下都创建一个 vendor 目录,每个项目所需的依赖都只会下载到自己vendor目录下,项目之间的依赖包互不影响。
其搜索包的优先级顺序,由高到低是这样的
- 当前包下的 vendor 目录
- 向上级目录查找,直到找到 src 下的 vendor 目录
- 在 GOROOT 目录下查找
- 在 GOPATH 下面查找依赖包
Go 1.11 引入 go module 功能,使用环境变量GO111MODULE=on开启该功能,三方库将会存储在GOMODCACHE而不是GOPATH/src
无法集中管理:多个项目有使用同一个包的统一版本,那么该包在各个项目都会存在一份,浪费磁盘,无法统一管理
依赖一致管理:若要将该项目部署到其他机器,需要将所有依赖包同样移动到该机器,才可保证环境一致
GOMODCACHE=C:\Users\Davis Jones\go\pkg\mod,默认为$GOPATH/pkg/mod
go.mod 文件
第一行:模块的引用路径
第二行:项目使用的 go 版本
第三行:项目所需的直接依赖包及其版本
exclude: 忽略指定版本的依赖包
replace:由于在国内访问golang.org/x的各个包都需要f.q,你可以在go.mod中使用replace替换成github上对应的库。
module github.com/BingmingWong/module-test
go 1.14
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pear // indirect
example.com/strawberry // incompatible
)
exclude example.com/banana v1.2.4
replace(
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)
go.sum 文件
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
每一行都是由 模块路径,模块版本,哈希检验值 组成,其中哈希检验值是用来保证当前缓存的模块不会被篡改。hash 是以h1:开头的字符串,表示生成checksum的算法是第一版的hash算法(sha256)。
有的包某个版本仅有一行 sum ,有的有两行
<module> <version>/go.mod <hash>
<module> <version> <hash>
<module> <version>/go.mod <hash>
那些有两行的包,区别就在于 hash 值不一行,一个是 h1:hash,一个是 go.mod h1:hash
而 h1:hash 和 go.mod h1:hash两者,要不就是同时存在,要不就是只存在 go.mod h1:hash。那什么情况下会不存在 h1:hash 呢,就是当 Go 认为肯定用不到某个模块版本的时候就会省略它的h1 hash,就会出现不存在 h1 hash,只存在 go.mod h1:hash 的情况。
go.mod 和 go.sum 是 go modules 版本管理的指导性文件,因此 go.mod 和 go.sum 文件都应该提交到你的 Git 仓库中去,避免其他人使用你写项目时,重新生成的go.mod 和 go.sum 与你开发的基准版本的不一致。
结论,使用 GOROOT 和 GOMODCACHE 即可