使用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/


猜你喜欢
- 一、从线性规划到整数规划1.1、为什么会有整数规划?线性规划问题的最优解可能是分数或小数。整数规划是指变量的取值只能是整数的规划。这在实际问
- python语句mode = ‘test’ if y is None else &lsquo
- 忽然想起一个CSS的特性,写一段代码玩玩:<style type="text/css">body {font
- 我就废话不多说了,大家还是直接看代码吧~# -*- coding: utf-8 -*-#keras==2.0.5#tensorflow==1
- python整数序列求和整数序列求和,用户输入一个正整数N,计算从1到N(包含1和N)相加之后的结果。代码如下:n=input("
- 问题问题1:如何解决事务提交时flush redo log带来的性能损失WAL是实现事务持久性(D)的一个常用技术,基本原理是将事务的修改记
- 语法df.drop_duplicates(subset = None,
- 问题:python spyder先出现dos窗口,然后后面就什么都没有了。解决方法:C:\用户\Administrator\.spyder3
- 通过一条命令用Npm安装gulp-htmlmin:npm install gulp-htmlmin --save-dev安装完毕后,打开gu
- 本文实例为大家分享了Python OpenCV实现视频分帧的具体代码,供大家参考,具体内容如下# coding=utf-8import os
- 1.必需的参数:必须参数须以正确的顺序传入函数,调用的数量必须和声明时的一样def f(name,age):print('I am
- java 中JDBC连接数据库代码和步骤详解JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤:
- 高考在即,笔者想为孩子以后能够快乐学习数学、学习编程找到一个比较合适的项目,经过一番比较发现github上的万星项目manim(https:
- 之前有个程序,里面有个时间部分是按照国内时区,也就是东八区,来写的,程序中定义了北京时间2点到八点进行检查;后面程序在国外机器上,例如说韩国
- 本文实例为大家分享了Python实现简单层次聚类算法,以及可视化,供大家参考,具体内容如下基本的算法思路就是:把当前组间距离最小的两组合并成
- 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法?方法一:基于Scrapy框架中的Spider的递归爬去进行实现
- XML、 XLink、 Namespace、 DTD、 Schema、 CSS、 XHTML...假如你从未接触XML, 或许你会感觉不知从
- 当你连接一个MySQL服务器时,你通常应该使用一个口令。口令不以明文在连接上传输。所有其它信息作为能被任何人读懂的文本被传输。如果你担心这个
- 背景:线上机器,需要过滤access日志,发送给另外一个api期初是单进程,效率太低,改为多进程发送后,查看日志中偶尔会出现异常错误(忘记截
- MySQL 表别名(Alias)SQL 表别名在 SQL 语句中,可以为表名称及字段(列)名称指定别名(Alias),别名是 SQL 标准语