团队博客
使用 Go Module 导入本地包
杜林君 2024-04
简介
Go Module 是从 Go 1.11 版本开始引入的依赖管理工具,并在 Go 1.13 成为默认配置。到 Go 1.14 发布后,官方正式推荐在生产环境中使用 Go Modules。本文将详细介绍如何在 Go Module 模式下导入本地包。
前提条件
假设我们有两个包:demo 和 mypackage,其中 demo 包会导入并调用 mypackage 包中的 New 方法。
// mypackage/mypackage.go package mypackage import "fmt" func New() { fmt.Println("mypackage.New") }
我们将分两种情况讨论:
- 在同一个项目下。
- 不在同一个项目下。
同一个项目下的导入
目录结构
在同一项目中,我们可以定义多个包。例如:
demo ├── go.mod ├── main.go └── mypackage └── mypackage.go
配置
在 demo/go.mod 文件中定义模块信息:
module demo go 1.14
导入包
在 demo/main.go 中导入 mypackage 包:
package main import ( "fmt" "demo/mypackage" // 导入同一项目下的mypackage包 ) func main() { mypackage.New() fmt.Println("main") }
示例
假设文件目录结构如下:
importpackage ├── dao │ └── mysql.go ├── go.mod └── main.go
importpackage/go.mod内容:
module github.com/test/importpackage go 1.14
importpackage/dao/mysql.go内容:
package dao import "fmt" func New() { fmt.Println("mypackage.New") }
importpackage/main.go内容:
package main import ( "fmt" "github.com/test/importpackage/dao" ) func main() { dao.New() fmt.Println("main") }
不同项目下的导入
目录结构
当两个包不在同一个项目路径下时,需要确保每个包都有自己的 go.mod 文件。例如:
├── demo │ ├── go.mod │ └── main.go └── mypackage ├── go.mod └── mypackage.go
配置
首先,在 mypackage 下初始化模块:
module mypackage go 1.14
然后,在 demo/go.mod 中添加 replace 指令以指向本地路径:
module demo go 1.14 require "mypackage" v0.0.0 replace "mypackage" => "../mypackage"
导入包
在 demo/main.go 中按如下方式导入:
package main import ( "fmt" "mypackage" ) func main() { mypackage.New() fmt.Println("main") }
示例
假设文件目录结构如下:
├── package1 │ ├── go.mod │ └── main.go └── package2 ├── go.mod └── package2.go
package2/go.mod内容:
module bendi.com/test/package2 go 1.14
package1/main.go中导入package2.go定义的函数:
package main import ( "fmt" "bendi.com/test/package2" ) func main() { package2.New() fmt.Println("main") }
因为 bendi.com/test/package2 并未上传至远程仓库,需在 package1/go.mod 中使用 replace 指令:
module github.com/test/package1 go 1.14 require "bendi.com/test/package2" v0.0.0 replace "bendi.com/test/package2" => "../package2"
总结
通过以上步骤,您可以轻松地在 Go Module 模式下导入本地包。无论是同一项目内还是不同项目间的包导入,只需正确配置 go.mod 文件和使用 replace 指令即可。希望这篇文章能帮助您更好地理解和使用 Go Module。