1 包简介
1.1 工作空间
GOPATHGOROOTgo get
1.2 源文件
- 编码:源码⽂件必须是 UTF-8 格式,否则会导致编译器出错。
- 结束:语句以 “;” 结束,多数时候可以省略。
- 注释:⽀持 “//”、 “/**/” 两种注释⽅式,不能嵌套。
- 命名:采⽤ camelCasing ⻛格,不建议使⽤下划线。
1.3 包命名
::: tip 包命名惯例
- 给包命名的惯例是使用包所在目录的名字。这让用户在导入包的时候,就能清晰地知道包名。
- 尽量使用简介明了的名字,但要避免冲突
- 包名一般使用单数的形式,但是避免冲突的用的复数比如bytes,errors,strings等
- 要避免包名有其他含义。比如 temp这种
- 命名时考虑包名和成员如何配合,尽量减少包名和成员有重复 :::
1.4 main 包
- 所有用 Go 语言编译的可执行程序都必须有一个名叫 main 的包。 go语言的编译器会将这种名字的包编译为二进制可执行文件。
- main包下肯定会有名为main()的函数,main()是程序的入口。
- 编译完会使用声明 main 包的代码所在的目录的目录名作为二进制可执行文件的文件名
2导包
关键字 Import ,进行导包。未使用的导入包,会编译错误。
2.1 两种方式
import a import b,…多次导入,以及import(a b c) 批量导入,如果导入的包不使用会报错。
2.2 包的别名
2.3 简洁模式
2.4非导入模式(匿名导入)
initdatabase/sql
2.5 导包的路径
import "learn/test"GOROOTGOPATH GOPATH
2.6 远程导入
(Distributed Version Control Systems, DVCS) GitHubLaunchpadBitbucket
import "github.com/xxxx/xxx"GOPATHGitHubDVCSGOPATH
go get 将获取任意指定的 URL 的包,或者一个已经导入的包所依赖的其 他包。由于 go get的这种递归特性,这个命令会扫描某个包的源码树,获取能找到的所有依赖包。
3 初始化 init
每个包可以包含任意多个 init 函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的 init 函数都会安排在 main 函数之前执行。 init 函数用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作。举例如下
3.1 init总结
- 每个源⽂件都可以定义⼀个或多个初始化函数。
- 编译器不保证多个初始化函数执行次序。
- 初始化函数在单⼀线程被调用,仅执行⼀次。
- 初始化函数在包所有全局变量初始化后执行。
- 在所有初始化函数结束后才执行 main.main。
- 无法调用初始化函数。
4 包管理
4.1 演变过程
- 2013年:Gedep,社区第一个包管理工具
- 2015年:vendor,Golang官方(golang1.5)
- 2016、2017 年:dep、manul、Godep、Govendor、godm (Govendor胜出)
- go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。
4.2 Go Model优点
- 不必须将项目目录放在GOPATH中
- 不使用vendor目录,而是统一安装到$GOPATH/pkg/mod/cache
- build/run时,自动析出项目import的包并安装
4.3 启用go module
go moduleGO111MODULEGO111MODULE=ongo moduleGOPATHgo modulego.modgo.sum
GO111MODULE=offGOPATHvendorGO111MODULE=onGOPATHvendorgo.modGO111MODULE=auto$GOPATH/srcgo.mod
4.4 GOPROXY
GOPROXYGOPROXY
5 go mod详解
5.1 go mod命令
常用的go mod命令如下:
go mod命令 | 描述 |
---|---|
go mod download | 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录) |
go mod edit | 编辑go.mod文件 |
go mod graph | 打印模块依赖图 |
go mod init | 初始化当前文件夹, 创建go.mod文件 |
go mod tidy | 增加缺少的module,删除无用的module |
go mod vendor | 将依赖复制到vendor下 |
go mod verify | 校验依赖 |
go mod why | 解释为什么需要依赖 |
5.2 go.mod说明
go.mod
- module用来定义包名
- require用来定义依赖包及版本
- indirect表示间接引用
5.2.1 依赖的版本
go modgo get foo@v1.2.3go get foo@mastergo get foo@e3702bed2
5.2.2 replace
golang.org/xgo.modreplacegithub
5.3 go get
::: tip 在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。
go get -ugo get -u=patchgo get package@versionversiongo mod download
5.3.1 整理依赖
go.modgo mod tidygo.mod
5.4 go mod edit
5.4.1 格式化
因为我们可以手动修改go.mod文件,所以有些时候需要格式化该文件。Go提供了一下命令:
5.4.2 添加依赖项
5.4.3 移除依赖项
go.modgo mod edit -droprequire=package pathgo.modgolang.org/x/text
6 项目中使用go module
6.1 现有项目
go module
go mod initgo.modgo getgo.sum
6.2 新项目
对于一个新创建的项目,我们可以在项目文件夹下按照以下步骤操作:
go mod init 项目名go.modgo.modrequirego get