使用go module导入本地包的方法教程详解

作者:Golang 时间:2024-03-26 01:44:43 

go module 是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始, go module 将是Go语言默认的依赖管理工具。到今天 Go1.14 版本推出之后 Go modules 功能已经被正式推荐在生产环境下使用了。

这几天已经有很多教程讲解如何使用 go module ,以及如何使用 go module 导入gitlab私有仓库,我这里就不再啰嗦了。但是最近我发现很多小伙伴在群里问如何使用 go module 导入本地包,作为初学者大家刚开始接触package的时候肯定都是先在本地创建一个包,然后本地调用一下,然后就被卡住了。。。

这里就详细介绍下如何使用 go module 导入本地包。

前提

假设我们现在有 moduledemo 和 mypackage 两个包,其中 moduledemo 包中会导入 mypackage 包并使用它的 New 方法。

mypackage/mypackage.go 内容如下:


package mypackage
import "fmt"
func New(){
fmt.Println("mypackage.New")
}

我们现在分两种情况讨论:

在同一个项目下

注意:在一个项目(project)下我们是可以定义多个包(package)的。

目录结构

现在的情况是,我们在 moduledemo/main.go 中调用了 mypackage 这个包。


moduledemo
├── go.mod
├── main.go
└── mypackage
 └── mypackage.go

导入包

这个时候,我们需要在 moduledemo/go.mod 中按如下定义:

module moduledemo

go 1.14

然后在 moduledemo/main.go 中按如下方式导入 mypackage


package main
import (
"fmt"
"moduledemo/mypackage" // 导入同一项目下的mypackage包
)
func main() {
mypackage.New()
fmt.Println("main")
}

举个例子

举一反三,假设我们现在有文件目录结构如下:

└── bubble
    ├── dao
    │   └── mysql.go
    ├── go.mod
    └── main.go

其中 bubble/go.mod 内容如下:


module github.com/q1mi/bubble

go 1.14

bubble/dao/mysql.go 内容如下:


package dao
import "fmt"
func New(){
fmt.Println("mypackage.New")
}

bubble/main.go 内容如下:


package main

import (
"fmt"
"github.com/q1mi/bubble/dao"
)
func main() {
dao.New()
fmt.Println("main")
}

不在同一个项目下

目录结构

├── moduledemo
│   ├── go.mod
│   └── main.go
└── mypackage
    ├── go.mod
    └── mypackage.go

导入包

这个时候, mypackage 也需要进行module初始化,即拥有一个属于自己的 go.mod 文件,内容如下:

module mypackage

go 1.14

然后我们在 moduledemo/main.go 中按如下方式导入:


import (
"fmt"
"mypackage"
)
func main() {
mypackage.New()
fmt.Println("main")
}

因为这两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在 go.mod 文件中使用 replace 指令。

在调用方也就是 packagedemo/go.mod 中按如下方式指定使用相对路径来寻找 mypackage 这个包。


module moduledemo
go 1.14
require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"

举个例子

最后我们再举个例子巩固下上面的内容。

我们现在有文件目录结构如下:

├── p1
│   ├── go.mod
│   └── main.go
└── p2
    ├── go.mod
    └── p2.go

p1/main.go 中想要导入 p2.go 中定义的函数。

p2/go.mod 内容如下:

module liwenzhou.com/q1mi/p2

go 1.14

p1/main.go 中按如下方式导入


import (
"fmt"
"liwenzhou.com/q1mi/p2"
)
func main() {
p2.New()
fmt.Println("main")
}

因为我并没有把 liwenzhou.com/q1mi/p2 这个包上传到 liwenzhou.com 这个网站,我们只是想导入本地的包,这个时候就需要用到 replace 这个指令了。

p1/go.mod 内容如下:

module github.com/q1mi/p1
go 1.14
require "liwenzhou.com/q1mi/p2" v0.0.0
replace "liwenzhou.com/q1mi/p2" => "../p2"

此时,我们就可以正常编译 p1 这个项目了。

说再多也没用,自己动手试试吧。

来源:https://www.liwenzhou.com/posts/Go/import_local_package_in_go_module/

标签:go,module,本地包
0
投稿

猜你喜欢

  • python连接clickhouse数据库的两种方式小结

    2024-01-24 19:25:02
  • ASP使用连接MYSQL数据库全攻略

    2007-09-23 09:06:00
  • python实现列表的排序方法分享

    2022-10-06 07:56:01
  • 详解用Python处理HTML转义字符的5种方式

    2021-01-27 20:53:17
  • 使用Javascript实现选择下拉菜单互移并排序

    2023-09-07 18:14:45
  • Vue循环组件加validate多表单验证的实例

    2024-05-05 09:23:39
  • Python smtplib实现发送邮件功能

    2021-02-14 20:07:26
  • CSS制作滑动折叠的文字效果

    2008-12-01 13:10:00
  • JavaScript实现仿淘宝商品购买数量的增减效果

    2024-06-07 15:26:09
  • Python异常类型以及处理方法汇总

    2021-11-22 00:07:03
  • 使用Python编写一个模仿CPU工作的程序

    2021-04-28 05:28:25
  • ASP所有的Session变量获取实现代码

    2011-03-11 10:44:00
  • Go interface{} 转切片类型的实现方法

    2024-05-05 09:31:05
  • 白话Block Formatting Context

    2010-08-03 12:36:00
  • Python爬虫Scrapy框架CrawlSpider原理及使用案例

    2023-12-23 07:41:55
  • python 根据网易云歌曲的ID 直接下载歌曲的实例

    2021-01-15 19:48:47
  • Python 中将二进制转换为整数的多种方法

    2023-01-11 17:30:53
  • 分享vim python缩进等一些配置

    2022-09-28 00:12:55
  • python 字典修改键(key)的几种方法

    2021-01-05 16:58:00
  • Pandas统计重复的列里面的值方法

    2022-03-06 20:20:57
  • asp之家 网络编程 m.aspxhome.com