使用golang编写项目的时候,除了安装自带的包之外,还涉及到引入他人或是自己写的包,这就涉及到了如何正确管理和引入的问题了。
一、
在golang中,使用import引入包时,会自动检测安装golang时设定的GOROOT路径中是否包含这个数据包。
所以如果涉及到一个常用的,不需要再修改的包,可以直接安装在GOROOT目录下。
可以使用 go env查看自己的GOROOT路径,或者是运行时报错也会提醒你路径是多少。
二、
但如果我们要引入的包不是非常完善,且需要我们进行修改,比如我们自己编写的一个包,我们不想把他放到GOROOT下而是和项目文件一起,因为项目文件一般在其它地方。这时候就可以选择使用Go Mod来进行包的管理。
.
├── main.go
├── go.mod
├── mypackage
├──mypackage1.go
├──mypackage2.go
├── go.mod
如果我们要在main.go中使用mypackage1.go和mypackage2.go。
首先我们需要初始化mypackage
go mod init mypackage
或是直接创建go.mod文件,并添加
module mypackage
go 1.20
其中go 1.20表示的是当前你系统中go语言的版本,而module其实并不表示包的名称,只是为了统一所以一般定义为包名。
而在mypackage中,mypackage1.go和mypackage2.go只需要在首行写
package mypackage
表示mypackage1.go和mypackage2.go都是属于mypackage这个包的。这段语句才指示了包的名称。
而在main.go同目录下的go.mod文件,则需要添加以下内容
module anyName
go 1.20
require mypackage v1.0.0
replace mypackage => ./mypackage
此时,require表示需要引入mypackage这个包,v1.0.0指示版本号。replace则是将mypackage替换为一个相对路径找到mypackage。
在main.go中引入mypackage则只需要添加以下内容即可
import "mypackage"
补充
上面提到module其实并不是指示包名,做如下测试。
//main.go
package main
import(
"fmt"
"m"
)
func main(){
fmt.Println("mypackage.E") //output: 1
}
//go.mod
module project1
go 1.20
require m
replace m => ./mypackage
//mypackage/mypackage1.go
package mypackage
var e = 1
//mypackage/mypackage2.go
package mypackage
var E = e
//mypackage/go.mod
module my
go 1.20
即便require的名称和包的名称和module的名称都不一样,只要路径对了,且指示了
package mypackage
就可以引入,并正常运行