对于一个项目来说,不可能所有代码都自己写。
所以这就涉及到引入别人的代码,得有效避免重复造轮子,在 Go 语言里面,这个操作也叫引包。
Go 语言诞生之后,升级了很多次一直都没有官方的包管理工具。
一直到 1.11 版才出现 go module 这个官方的管理工具。
于是现在的大部分 Go 语言新项目都在使用 go module 来进行包管理。
我们用得非常多的是使用 go module 引入 Github 上的包,直接 go get
就搞定了。
但是如何引入本地的包呢?
在实际开发中,这是我们最见的场景。
一般情况下我们在项目的目录下面,会建很多的包,他们并不冲突,比如下面结构图中的:instance
,kun-package
。
.
├── main.go
├── go.mod
├── instance
│ └── UserInstance.go
└── kun-package
└── Hello.go
如果你想在 main.go 里面想要使用kun-package
包里面的代码,你只需要初始化 go module 即可,他会自动生成类似以下内容的 go.mod 文件:
module design
go 1.17
这是两个关键信息:
第一行是我们的这个总包的名字。
你可以理解为,我们新建的 go 项目其实也就是一个大包。
然后你会发现我在引入本地的包时,前面的包名就是这个名字:
package main
import (
kunPackage "design/kun-package"
"fmt"
)
func main() {
fmt.Println("hello world")
kunPackage.SayHello()
}
看到 kun-package 前面的 design 了么?
举一反三,如果你修改了 go.mod 里面的第一行为 github.com/golangstackdev
那你项目里 main.go 文件里面的引入也就得变成 github.com/golangstackdev/kun-package
。
go.mod 里面第二行是设定我们当前环境的 go 版本,也就是最小版本支持。
其实难免我们要引用的包,是别人项目下面的,而不是自己项目下面的。
我们先来看一个项目结构图:
project01
├── go.mod
└── main.go
project02
└── kun-package
├── go.mod
└── hello.go
我们的工程01
(project01)下面新建了一个 main.go ;
同时在工程01
所在目录,我们还有一个工程02
(project02)。
工程01
里面需要使用的工程02
里面的包。
这个时候,要想完成引用的话:被引用的包和使用的工程都要有各自独立的 go.mod 文件。
project02/kun-package/go.mod
内容非常简单,就是基础的两行:
module kun-package
go 1.17
而 project01/go.mod
里面就比较复杂了,需要做两步操作:
module project01
go 1.17
require kun-package v0.0.0
replace kun-package => ../project02/kun-package
require 是声明我们引入的包名和版本。
replace 是进行替换对于的包指向路径。
非常容易理解!
然后我们在project01/main.go
文件里面就可以正常的使用了:
package main
import (
kunPackage "kun-package"
)
func main() {
kunPackage.SayHello()
}
你学废了么?