文件默认保存路径:$GOPATH/src/
下
go env
- GOARCH:目标处理架构
- GOBIN:'go install’将安装命令的目录。
- GOOS:目标操作系统
- GOPATH:当前工作目录
- GOROOT:Go开发包安装目录
项目工作目录(GOPATH)
必须有:
src
:项目源码【只能在项目的src中编写文件!】bin
:编译生成的二进制文件(go install
)pkg
:存储预编译的目标文件,以加快程序的后续编译速度。【第三方包】
Go Modules 代替 GOPATH
GOPATH问题:
- 所有的源码必须在
$GOPATH/src/
下 - 无法进行依赖包版本控制:
go get
命令下载的依赖包是当前依赖包的最新版本,如果我们对依赖包的版本有要求,就不能使用go get
命令。
使用Go Modules开发项目
相关环境变量
$ go env
GO111MODULE="on"//或auto
GOPROXY="https://proxy.golang.org,direct"
GOPRIVATE="https://goproxy.cn,direct"
...
Go Modules开关:GO111MODULE
- auto:只要项目包含了 go.mod 文件的话启用 Go modules,目前在 Go1.11 至 Go1.14 中仍然是默认值。
- on:启用 Go modules,推荐设置,将会是未来版本中的默认值。
- off:禁用 Go modules,不推荐设置。
Go Modules进行版本控制的方法
- Go项目源码可以在任意地方!
- 所有的依赖(也就是mod)都存放在:
$GOPATH/pkg/mod
- Go项目的依赖版本控制文件:
Go项目/go.mod
- 依赖校验和:
Go项目/go.sum
【考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构建。为了解决Go module的这一安全隐患,Go开发团队在引入go.mod的同时也引入了go.sum文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建。】
Go Modules命令
GOPROXY
【从Go官方远程仓库拉取模块版本,有默认值!】
GOPROXY
:Go模块代理,作用是用于使 Go 在后续拉取模块版本时能够脱离传统的 VCS 方式,而是直接通过镜像站点来快速拉取。国内默认值应为:https://goproxy.cn,direct
,否则通过命令设置:
$ go env -w GOPROXY="https://goproxy.cn,direct"
GOPRIVATE
【从私有仓库拉取模块版本,没有默认值!建议使用】
公司开发往往是私有仓库,我们需要从私有仓库中拉取版本!所以建议使用GOPRIVATE
,设置GOPRIVATE
,多个用,
分开:
$ go env -w GOPRIVATE="gitlab.huolala.work"
开发过程
一、开启GO111MODULE
$ go env -w GO111MODULE=on
包(package)
- 项目的
src
下存放包或go
源码 - 包中当然还可以有包
main
函数只能在main包中!go
中package
与所属包文件无关联! 【注:以下所有的包都是go
源码中package
,与包文件名无关!】- 给
package
取别名:
import (
"fmt"
test "package1"
)
导出标识符
一个常量、变量、类型、函数等想要被其他包使用时,其变量名首字母必须大写,否则只能在包内使用!
导入包(import)
import "fmt"
import (
"fmt"
"package1"
"package2"
)
引用其他包方法: 包名.方法名()
test.T1()
main()
之前执行的包初始化init()
- 虽然一个包可以有多个
init()
,但建议集合成一个!【同一个包中的多个init()
时执行顺序不可预测!】 init()
会按照main函数引用包结构树的深度优先顺序在main函数之前运行!