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。
本文分享自 FreeSWITCH中文社区 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!