对于一个项目来说,不可能所有代码都自己写。

所以这就涉及到引入别人的代码,得有效避免重复造轮子,在 Go 语言里面,这个操作也叫引包。

Go 语言诞生之后,升级了很多次一直都没有官方的包管理工具。

一直到 1.11 版才出现 go module 这个官方的管理工具。

于是现在的大部分 Go 语言新项目都在使用 go module 来进行包管理。

我们用得非常多的是使用 go module 引入 Github 上的包,直接 go get 就搞定了。

但是如何引入本地的包呢?

一、引入的包在同一项目下

在实际开发中,这是我们最见的场景。

一般情况下我们在项目的目录下面,会建很多的包,他们并不冲突,比如下面结构图中的:instancekun-package

1
2
3
4
5
6
7
.
├── main.go
├── go.mod
├── instance
│   └── UserInstance.go
└── kun-package
    └── Hello.go

如果你想在 main.go 里面想要使用kun-package 包里面的代码,你只需要初始化 go module 即可,他会自动生成类似以下内容的 go.mod 文件:

1
2
3
module design

go 1.17

这是两个关键信息:

第一行是我们的这个总包的名字。

你可以理解为,我们新建的 go 项目其实也就是一个大包。

然后你会发现我在引入本地的包时,前面的包名就是这个名字:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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 版本,也就是最小版本支持。

二、不在同一项目下面

其实难免我们要引用的包,是别人项目下面的,而不是自己项目下面的。

我们先来看一个项目结构图:

1
2
3
4
5
6
7
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 内容非常简单,就是基础的两行:

1
2
3
module kun-package

go 1.17

project01/go.mod 里面就比较复杂了,需要做两步操作:

1
2
3
4
5
6
7
module project01

go 1.17

require kun-package v0.0.0

replace kun-package => ../project02/kun-package

require 是声明我们引入的包名和版本。

replace 是进行替换对于的包指向路径。

非常容易理解!

然后我们在project01/main.go 文件里面就可以正常的使用了:

1
2
3
4
5
6
7
8
9
package main

import (
	kunPackage "kun-package"
)

func main() {
	kunPackage.SayHello()
}