在Golang1.11版本之前如果我们要自定义包的化必须把项目放在gopath目录。Go1.11版本之后无需手动配置环境变量,使用go mod管理项目,也不需要非得把项目放到GoPath指定目录下,你可以在任意磁盘位置。go1.13版本之后不需要GOPATH
实际项目开发中我们首先要在我们项目中用 go mod 命令生成一个 go.mod 文件管理我们项目的依赖。
比如我们的golang项目文件要放在 study文件加下,这个时候我们需要在这个文件夹下使用go mod 命令生成一个go.mod文件
go mod init study
包(package)是多个Go源码的集合,一个包可以简单理解为一个存放多个.go文件得到文件夹。该文件夹下面的所有的go文件都要在代码的第一行添加如下代码,声明该文件归属的包。
package 包名
1. 一个文件夹下面直接包含的文件只能归属一个package,同样一个package的文件不能在多个文件夹下。
2. 包名可以不和文件夹的名字一样,包名不能包含 - 符号。
3. 报名为main的包为应用程序入口包。这种包编译后会得到一个可执行文件,而编译不包含main包的源代码则不会得到可执行文件。
如果我们想同同时导入两个有着名字相同的包。 那么可以导入包重命名,导入包的重命名之影响当前的源文件。其他源文件如果导入相同的包,可以用导入包原本默认的名字或另起一个不一样的名字。
导入包重命名,可以解决名字冲突,也可以为了简洁方便使用,另外也可以解决与变量名冲突。
- import (
-
- "hello/word"
- tu "tuiu/word"
- )
在go语言程序执行时导入包会自动触发包内部init()函数的调用。需要注意的是:init()函数没有参数也没有返回值。init()函数在程序运行时自动被调用执行,不能在代码中主动调用它。
在包初始化执行的调用顺序是:全局声明 -> init() -> main()
go语言会从main包开始检查其导入所有的包,每个包中都可能导入其他的包。Go编译器由此构建出一个树状的包引用关系,在根据引用顺序决定编译顺序,依次编译这些包的代码。
在运行时,被最后导入的包会最先初始化并调用其init函数:
main -> import ->A -> import -> B -> import -> C
main.init() <- A.init() <- B.init() <- C.init()
- import (
- _ "path/package"
- )
这种写法是希望导入包,但是不使用包内的任何结构,不使用包内任何函数。
匿名导入的包与其他方式导入的包一样 会让导入包编译到可执行文件中,同时,导入包会触发init()函数调用。
可以在https://pkg.go.dev/查找常见的golang第三方数据包
1.下载安装第三方包
下载方法
第一种方法:(全局)
go get 包名称(github.com/shopspring/.decimal)
网络问题,成功概率不高
第二种方法:
go mod download
依赖包会自动下载到$GOPATH/pack/mod ,多个项目可以共享缓存的mod
第三种方法:
go mod vendor 将依赖复制到当前项目的vendor下
go mod 命令解释
1.go mod download 下载依赖的module到本地的缓存
2.go mod edit 编译go mod 文件
3.go mod graph 打印模块依赖图
4.go mod init 在当前文件加下初始化一个新的module,创建go.mod 文件
5.go mod tidy 增加丢失的module,去掉未用的module
6.go mod vendor 将依赖复制到vendor下
7.go mod verify 校验以来,检查下载的第三方库有没有本地修改,如果有修改返回非0,否则验证成功