1.包管理
1.1 概述
go语言是使用包来组织源代码的,包是多个go源文件的集合,任何源码文件都必须属于某个包,源文件的第一行有效代码必须是package packageNam 语句 该语句是声明所在的包名称
注意事项:
包名一般是小写的,见名知意,包名中不能包含
-
等特殊符号。包名规范上要和所在的目录同名,也可以不同
包名为 main 的包为应用程序的入口包,编译不包含 main 包的源码文件时不会得到可执行文件。
一个文件夹下的所有源码文件只能属于同一个包,同样属于同一个包的源码文件不能放在多个文件夹下.
一个包下的不同文件不能含有同名函数
如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public),在Go语言中只需要将标识符的首字母大写就可以让标识符对外可见
1.2 包导入方式
import “包” (此处的包是指存放源文件的父级目录名称,调用时则使用每个go源文件中package 声明的包名称进行调用)
import Alias name “包” (别名方式导入,后续调用使用别名.方法或属性 进行调用)
import . “包” ( 通过. 来表示,将该包中的所有变量及方法导入,调用时不需要使用任何前缀,直接调用即可
import _ “包” (表示只执行包中的init函数方法,不导入包中的其他任意数据)
1.3 包加载顺序
init()
函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。Init函数通常被用作
对变量进行初始化
检查/修复程序的状态
注册
运行一次计算
注意事项
一个包可以有多个 init 函数,包加载时会执行全部的 init 函数,但并不能保证执行顺序,所以不建议在一个包中放入多个 init 函数,将需要初始化的逻辑放到一个 init 函数里面。
包不能出现环形引用的情况,比如包 a 引用了包 b,包 b 引用了包 c,如果包 c 又引用了包 a,则编译不能通过。
包的重复引用是允许的,比如包 a 引用了包 b 和包 c,包 b 和包 c 都引用了包 d。这种场景相当于重复引用了 d,这种情况是允许的,并且 Go 编译器保证包 d 的 init 函数
只会执行一次
。
init()
函数没有参数也没有返回值。init()
函数在程序运行时自动被调用执行,不能在代码中主动调用它。
1.4 GOPATH方式
在go1.11版本之前都是使用GOPATH 进行包管理,
需要将项目代码放在GOPATH/src目录下, 在导入包时从src之后的目录开始导入(不包含src目录层级)
注意:
1.将GO111MODULE 设置为auto 或off
go env -w GO111MODULE=“off/auto”
1.4.1 env环境配置
go env |grep -i gopath
GOPATH="/Users/dongdong/Desktop/mydir/self/golang"
# 可通过 go env -w GOPATH="xxxxx" 进行设置路径
1.4.2 导入包查找顺序
GOROOT/src -----> GOPATH/src
db包
[
若将mysite移出GOPATH/src目录以外的地方,执行会报错,这就是GPATH包管理的一种缺陷.
1.5 GOMODULE
由于GOPATH包管理的缺陷,在go1.11以后出现了go module管理方式
1.5.1 env环境配置
需要将GO111MODULE参数设置为auto或者on状态
go env |grep -i module
GO111MODULE="auto"
# 可通过 go env -w GO111MODULE="auto/on" 进行设置
1.5.2 go mod使用
- go mod init(初始化项目仓库)
cd mysite
go mod init [module 名称] module若不写 则默认为父级目录名称,后续此项目中导入包
就以mysite(只针对mysite项目下的包相互导入时)
# 会生成一个go.mod文件,文件内容如下(go.mod存在则删除后再执行go mod init)
module mysite
go 1.17
此时将mysite项目放在系统的任意位置,都可以正常执行
- go mod tidy(包依赖检测,必须有go.mod文件存在)
cd mysite
go mod tidy
# 会自动添加项目缺失的模块以及移除不需要的模块
# 添加的模块文件存放在GOPATH/pkg/mod 目录下
# 并将拉取的包信息(地址,版本)存放在go.mod文件中
- go mod verify(检查下载下来的文件有没有修改过)
检查当前模块的依赖是否全部下载下来,是否下载下来被修改过。如果所有的模块都没有被修改过,那么执行这条命令之后,会打印
all modules verified
。
cd mysite
go mod verify
all modules verified
- go mod vendor
在项目目录下生成vendor文件夹,用来区分某些库的不同版本。该文件夹下将会放置你
go.mod
文件描述的依赖包,文件夹下同时还有一个文件modules.txt
,它是你整个工程的所有模块。在执行这条命令之前,如果你工程之前有vendor目录,应该先进行删除
cd mysite
go mod vendor
不同版本。该文件夹下将会放置你`go.mod`文件描述的依赖包,文件夹下同时还有一个文件`modules.txt`,它是你整个工程的所有模块。在执行这条命令之前,如果你工程之前有vendor目录,应该先进行删除
```Shell
cd mysite
go mod vendor