go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。

到今天Go1.14版本推出之后Go modules 功能已经被正式推荐在生产环境下使用了。

这几天已经有很多教程讲解如何使用go module,以及如何使用go module导入gitlab私有仓库,我这里就不再啰嗦了。

但是最近我发现很多小伙伴在群里问如何使用go module导入本地包,

作为初学者大家刚开始接触package的时候肯定都是先在本地创建一个包,然后本地调用一下,然后就被卡住了。。。

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

前提

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

mypackage/mypackage.go内容如下:

package mypackage

import "fmt"

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

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

1. 在同一个项目下

注意:在一个项目(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")
}

2. 不在同一个项目下

目录结构

├── 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导入本地包的更多相关文章

  1. pycharm最新版新建工程没导入本地包问题:module 'selenium.webdriver' has no attribute 'Firefox'

    前言 最新版的pycharm做了很大的改变,新建工程的时候,默认不导入本地的安装包,这就导致很多小伙伴踩坑了... 明明已经pip安装过selenium了,但是却报AttributeError:mod ...

  2. 解决pycharm无法导入本地包的问题

    在用python写爬虫程序时,import 行无法通过,具体情况如下: pycharm运行程序后,程序pass了,但是出现了警告,如下图所示: 这是由于该程序不在根目录下,无法导入本地包,解决办法如下 ...

  3. pycharm(v 2018.1)新建工程没有导入本地包

    新版的pycharm默认新建的工程Virtualenv(虚拟的环境),在创建环境时一定要注意勾选 Inherit global site-packages: 导入本地包 Make available ...

  4. 解决pycharm无法导入本地包的问题(Unresolved reference 'tutorial')

    在用scrapy(python2.7)写爬虫的时候 from tutorail.items import DmozItem 这一行死活不成功 也就是出现 Unresolved reference 't ...

  5. [转]解决pycharm无法导入本地包的问题(Unresolved reference 'tutorial')

    原文地址:https://www.cnblogs.com/yrqiang/archive/2016/03/20/5297519.html

  6. paycharm导入webdriver包报错:module 'selenium.webdriver' has no attribute 'Firefox'

    首先:试试看在cmd中试试输入from selenium import webdriver,看是否报错,看一看是不是pycharm的原因.经过确认,在dos窗口中输入导入包的命令并没有报错.最后我重现 ...

  7. idea中导入本地jar包

    idea中有时需要从本地导入jar包. 1:file>projectstructure 或者右键项目 open module setting, 选择librarys,然后点击+号,选择要导入的语 ...

  8. maven向本地仓库导入jar包(处理官网没有的jar包)

    对于官网没有的jar包,maven向本地仓库导入jar包用如下命令 mvn install:install-file -DgroupId=包名 -DartifactId=项目名 -Dversion=版 ...

  9. maven将本地jar包导入本地仓库

    从maven中央仓库下载下来的jar包手动导入本地库,如下图 以下其中maven的dependency <dependency> <groupId>org.molgenis&l ...

  10. maven 整合支付宝,导入alipay-sdk-java包到本地仓库

    maven 整合支付宝,导入alipay-sdk-java包到本地仓库   1.环境变量添加: MAVEN_HOME:(maven位置) M2_HOME:(maven位置) PATH:%M2_HOME ...

随机推荐

  1. KingbaseES例程_普通表在线转分区表(基于规则)

    KingbaseES例程_普通表在线转分区表 概述 普通表转分区表,使用视图的替换式规则,以路由方式,实现在线转移数据. 数据准备 /*普通大表*/ create table tab_single a ...

  2. KingbaseES V8R6 常用的系统函数

    查看当前日志文件lsn位置: select sys_current_wal_lsn(); 查看某个lsn对应的日志名: select sys_walfile_name('0/1162FBA0'); 查 ...

  3. Linux系统上安装jdk(CentOS 7 )

    目录 001. 搜索jdk安装包 002. 下载安装jdk1.8 003. 配置环境变量 004. 验证是否配置成功 001. 搜索jdk安装包 yum search java | grep jdk ...

  4. #博弈论#Poj 2484 A Funny Game

    题目 \(n\)个石子排成一圈,每次可以取一个或相邻的一对, 取完为胜,问先手是否必胜 分析 无论先手如何取,后手都能模仿先手的取法. 比如说,当石子个数为奇数时先手取相邻的一对,后手可以将对面的那一 ...

  5. #dp#D 导出子图

    代码 #include <cstdio> #include <cctype> #include <algorithm> #define rr register us ...

  6. Manacher小记

    目录 前言 洛谷 3805[模板]manacher算法 题目 分析 代码 洛谷 4555 最长双回文串 题目 分析 代码 洛谷 1659 拉拉队排练 题目 分析 代码 前言 皆移植于原csdn博客,略 ...

  7. java中的类型擦除type erasure

    目录 简介 举个例子 原因 解决办法 总结 简介 泛型是java从JDK 5开始引入的新特性,泛型的引入可以让我们在代码编译的时候就强制检查传入的类型,从而提升了程序的健壮度. 泛型可以用在类和接口上 ...

  8. Git 13 暂存代码

    如果当前分支的功能还没开发完,无法提交代码. 但出现了紧急情况(比如线上BUG),需要立即切换到其他分支进行开发. 此时可以先暂存当前分支代码,等切换回当前分支的时候再恢复. 1.暂存当前分支变更: ...

  9. Qt搜索本机网卡对应网段的在线设备

    需求:销售给我的需求是找出哪些IP是没有被占用的,所以我要先找出已经被占用的IP 项目是Qt开发的,所以在网上搜索了下,搜索到的实现方式都是:QHostInfo::lookupHost,但是这种方式, ...

  10. Python smtp发送邮件怎么设置抄送人

    设置抄送人,非常简单,只需要添加一条信息就可以了,例: cc_list = ['xx@xxx.cn', 'xx@xxx.cn'] msg['Cc'] = ','.join(cc_list) smtp. ...