Golang官网:https://go.dev/、Golang下载:https://go.dev/、Golang学习文档:https://go.dev/doc/
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
安装Golang
相关文档:https://go.dev/doc/install,下载对应操作系统的安装包后,按说明安装即可;
环境变量
环境变量主要是能操作系统能在任意目录访问go的可执行文件,Window下将go的安装目录添加到PATH环境变量即可(C:Program FilesGobin);
代码语言:javascript复制GOOS #编译系统
GOARCH #编译arch
GO111MODULE #gomod开关
GOPROXY #go代理 https://goproxy.io https://goproxy.cn
GOSSAFUNC #生成SSA.html文件,展示代码优化的每一步 GOSSAFUNC=func_name go build
GOPATH #用来指定项目开发目录,所有项目文件都在这个路径下面
GOROOT #GO的安装路径
依赖管理
1.软件包
软件包仓库:https://pkg.go.dev/,Go1.13之后GOPROXY默认值为https://proxy.golang.org,在国内是无法访问的;修改镜像地址:
代码语言:javascript复制go env -w GOPROXY=https://goproxy.cn,direct
Go语言从v1.5开始开始引入vendor模式,查找项目的某个依赖包,首先会在项目根目录下的vender文件夹中查找,如果没有找到就会去$GOAPTH/src目录下查找。
从 Go1.11 开始, Go 官方加入 Go Module 支持, Go1.12 成为默认支持; 从此告别源码必须放在 Gopath 中 以及 Gopath 对初学者造成的困扰.
要启用go module支持首先要设置环境变量GO111MODULE(如其名字所暗示,GO111MODULE 是 Go 1.11 引入的新版模块管理方式。),通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。
- GO111MODULE=off禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
- GO111MODULE=on启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
- GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。
简单来说,设置GO111MODULE=on之后就可以使用go module了,以后就没有必要在GOPATH中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。
相关
使用 go module 管理依赖后会在项目根目录下生成两个文件go.mod和go.sum。
2.初始化
代码语言:javascript复制go mod init [module 名称] #初始化
go mod tidy #检测和清理依赖
3.安装依赖
代码语言:javascript复制go get -v path #安装指定包
go get -u #更新依赖
go get -u github.com/go-ego/gse #更新指定包依赖
go get -u github/com/go-ego/gse@v0.60.0-rc4.2 #指定版本
4.替换安装源
在国内访问http://golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。
代码语言:javascript复制# 使用命令行:
go mod edit -replace github.com/go-ego/gse=/path/to/local/gse
go mod edit -replace github.com/go-ego/gse=github.com/vcaesar/gse
#直接修改模块文件:
replace github.com/go-ego/gse => github.com/vcaesar/gse
5.常用命令
代码语言:javascript复制go mod init # 初始化 go.mod
go mod tidy # 更新依赖文件
go mod download # 下载依赖文件
go mod vendor # 将依赖转移至本地的 vendor 文件
go mod edit # 手动修改依赖文件
go mod graph # 打印依赖图
go mod verify # 校验依赖
6.GOPATH
go 命令依赖一个重要的环境变量:$GOPATH,Go 从1.1版本到1.7必须设置这个变量,而且不能和Go的安装目录一样,这个目录用来存放Go源码,Go的可运行文件,以及相应的编译之后的包文件。所以这个目录下面有三个子目录:src、bin、pkg
从go 1.8开始,GOPATH 环境变量现在有一个默认值,如果它没有被设置。 它在Unix上默认为$HOME/go,在Windows上默认为%USERPROFILE%/go。
- src 存放源代码(比如:.go .c .h .s等)
- pkg 编译后生成的文件(比如:.a)
- bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 PATH 变量中,如果有多个gopath,那么使用{GOPATH//://bin:}/bin添加所有的bin目录)
7. go.mod
go.mod文件记录了项目所有的依赖信息,其结构大致如下:
代码语言:javascript复制module github.com/Q1mi/studygo/blogger
go 1.12
require (
github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
github.com/gin-gonic/gin v1.4.0
github.com/go-sql-driver/mysql v1.4.1
github.com/jmoiron/sqlx v1.2.0
github.com/satori/go.uuid v1.2.0
google.golang.org/appengine v1.6.1 // indirect
)
- module用来定义包名
- require用来定义依赖包及版本
- indirect表示间接引用
相关文档:https://zhuanlan.zhihu.com/p/359843333
IDE工具
Jetbrains全家桶:https://www.jetbrains.com/zh-cn/go/
代码目录结构
GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/mymath 表示mymath这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包。
所以当新建应用或者一个代码包时都是在src目录下新建一个文件夹,文件夹名称一般是代码包名称,当然也允许多级目录,例如在src下面新建了目录$GOPATH/src/github.com/astaxie/beedb 那么这个包路径就是"github.com/astaxie/beedb",包名称是最后一个目录beedb
注意
一般建议package的名称和目录名保持一致
1.编译应用包
代码语言:javascript复制# 编译后生成编译的应用包文件到pkg
cd 应用包源代码目录
go install
# 或者
go install 应用包源代码目录
命令行
1. 命令大全
代码语言:javascript复制go build // 编译包和依赖包
go clean // 移除对象和缓存文件
go doc // 显示包的文档
go env // 打印go的环境变量信息
go bug // 报告bug
go fix // 更新包使用新的api
go fmt // 格式规范化代码
go generate // 通过处理资源生成go文件
go get // 下载并安装包及其依赖
go install // 编译和安装包及其依赖
go list // 列出所有包
go run // 编译和运行go程序
go test // 测试
go tool // 运行给定的go工具
go version // 显示go当前版本
go vet // 发现代码中可能的错误
2. go get
get 命令用来解决go模块及其依赖项目的下载、创建和安装问题。实际该命令线执行从在线仓库(BitBucket、GitHub、Google Code、国内的gitee等)下载模块(包),再执行Go Install命令。get 命令是依赖git。
get 会先下载相关依赖项目模块,下载时每个包或包的部分模块,下载的版本默认遵从以下顺序:最新release版 > 最新pre-release版 > 其他可用的较高版本
- -d 只下载,而不执行创建、安装
- -t 同时下载命令行指定包的测试代码(测试包)
- -u 在线下载更新指定的模块(包)及依赖包(默认不更新已安装模块),并创建、安装
- -v 打印出所下载的包名
- -insecure 允许命令在非安全的scheme(如HTTP)下执行get命令
- -fix 在下载代码包后先执行修正动作,而后再进行编译和安装,根据当前GO版本对所下载的模块(包)代码做语法修正
- -f 忽略掉对已下载代码包的导入路径的检查
- -x 打印输出,get 执行过程中的具体命令
学习文档
- https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md
- https://github.com/Unknwon/go-study-index