go提供了两种包管理方式,分别是go path和go mod。 go mod管理方式需要go环境变量中的GO111MODULE=“on”。
为什么需要包管理在使用go编写项目时,除了go标准库提供的包(fmt、os、net等),还经常需要使用第三方包(例如从github上下载的第三方包)。这时候就需要包管理来快速有效的导入并使用这些第三方包。
go mod init $module_name $module_name和目录名可以不一样
导入包的路径查找规则$GOROOT环境变量是go的安装目录,下面的src目录是存放go标准库的地方。
当我们import一个包时,go语言对包的查找规则如下:
- 如果是go标准库提供的包(fmt、os等),那么就在$GOROOT/src下查找。
- 如果是自己写的包或者网络上的第三方包,那么分两种情况,一种是go path管理包的方式;另一种是go mod管理包的方式。
- go path:如果只开了这种方式,会直接去$gopath环境变量定义的路径下寻找对应的包。但是,这种方式,自己写的包和网络上的包都放置在一起,不方便管理。
- go mod:为了应对go path的缺点,从go1.11版本就推出了go modules包管理方式。开启了这种方式,寻找除了标准库包时,就会到$GOPATH/pkg/mod目录下查找,这是个go mod方式存放包的路径。
go mod需要配合go.mod文件来使用。
进入项目根目录下,使用go mod init $module名(随意取),来生成一个go.mod文件。
go.mod文件的作用:
go.mod文件标记了当前go的版本、module名以及它的依赖库和这些依赖库的版本。
一个go.mod文件的内容大概如下:
module gofilemonitor
go 1.18
require github.com/fsnotify/fsnotify v1.5.4
require golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
当引入网络上的第三方包时用go get来下载:
go get github.com/xxx@version
如果需要自动下载go程序中用到的所有的第三方包或者不小心将某一个下载到本地的包删掉了,那么可以使用tidy:
go mod tidy
它会检查源码中import导入的包中,有没有第三方包时本地没有的,然后直接下载回来
包的引用tips-
可以直接使用同目录下其他go文件里的变量、函数、结构体。
-
跨目录使用则需要变量前加入包名,并且引入包所在的目录。
-
同一个目录下的包名必须相同。
-
包的别名。
例如:
import mymymy "go-package/mathpackage" func main(){ mymathpackage.add() }
别人看到这段代码时,并不知道mymathpackage这个包是哪个导入的文件中的包,因为开发者在写这个go文件的时候,包名没有和go文件名相同。所以为了读代码方便,一般这种名字不同的情况下,会为它取个别名。 例如上面的别名mymymy。可以直接mymymy.add()来调用