go语言引入第三方包
第三方包
假设我们有个项目叫caseshow,我们先创建这个目录,并初始化一下
mkdir caseshow
cd caseshow
go mod init caseshow
此时在caseshow目录下会自动产生一个go.mod文件
比如我们想使用一个redis客户端:github.com/go-redis/redis/v8,在当前路径下直接执行go get命令即可:
go get github.com/go-redis/redis/v8
目录下会多一个go.sum文件,go.mod文件里面也多了关于redis库的内容,之后就可以直接用了。
本地包
在项目开发中会复用本地的一些代码,这就涉及到了本地包的引入。
情况1 同目录下
在同路径下不能存在多个package名,如果要定义其他的package,可以创建一个对应名字的目录,把代码放下面,之后再引用。
假设在caseshow中有个本地开发的包mymodule,里面有个方法Pprint,结构如下
# tree
.
├── go.mod
├── go.sum
├── mymodule
│ └── pprint.go
└── redis.go
1 directory, 4 files
如果caseshow目录下的其他地方要用这个方法,则使用caseshow + package名称导入即可。
比如main.go:
package main
import "caseshow/mymodule"
func main(){
mymodule.Pprint("jack")
}
情况2 不同目录下
假设有另一个项目caselive,与caseshow同级,该目录下有个包yourmodule,里面有个方法Yprint:
# tree
.
├── caselive
│ ├── go.mod
│ ├── main.go
│ └── yourmodule
│ └── yprint.go
└── caseshow
├── go.mod
├── go.sum
├── main.go
├── mymodule
│ └── pprint.go
└── redis.go
4 directories, 8 files
此时在caseshow中要调用caselive中yourmodule的Yprint方法,可以用replace参数来实现。
在caseshow的go.mod中增加caselive的引入:
module caseshow
go 1.15
require github.com/go-redis/redis/v8 v8.4.2 // indirect
require caselive v0.0.0
replace caselive => ../caselive
之后就能直接调用了:
package main
import "caseshow/mymodule"
import "caselive/yourmodule"
func main(){
mymodule.Pprint("jack")
yourmodule.Yprint("jack")
}
理解理解Golang包导入,import、包名、目录名的关系
- import后面的最后一个元素是路径,就是目录,并非包名。go语言的惯例只是一个特例,即恰好目录名与包名一致罢了。
import "fmt"
fmt.Println("xxx")
这里上下两行中虽然都是“fmt",但同样含义不同,一个是路径 ,对于标准库来说,是$GOROOT/src/fmt这个路径。而第二行中的fmt则是包名。gc会在$GOROOT/src/fmt路径下找到fmt包的源文件。
- 包名和目录名没有关系,但是包名最好等于目录名
- 同一个目录下只能有一种包名。
按照Golang语言习惯,一个go package的所有源文件放在同一个目录下,且该目录名与该包名相同,比如libproj1/foo目录下的package为foo,foo1.go、 foo2.go…共同组成foo package的源文件。但目录名与包名也可以不同,
引入从github下载包的一些情况
一些从github下载的包在引入时会报错,
could not import xxx (no required module provides package ...
这时可尝试删除引入的包中的go.mod文件,保存一下再试试