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

 更新时间:2020年03月01日 11:23:06   作者:Golang  
go module 将是Go语言默认的依赖管理工具。到今天 Go1.14 版本推出之后 Go modules 功能已经被正式推荐在生产环境下使用了。本文重点给大家介绍如何使用 go module 导入本地包,感兴趣的朋友一起看看吧

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 这个项目了。

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

总结

到此这篇关于使用go module导入本地包的方法教程详解的文章就介绍到这了,更多相关go module 导入本地包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go panic和recover函数使用细节深入探究

    Go panic和recover函数使用细节深入探究

    这篇文章主要为大家介绍了Go 的panic和recover函数使用细节深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • golang简单位运算示例

    golang简单位运算示例

    这篇文章主要介绍了golang简单位运算,包括位移运算、取反及位与位或等运算,需要的朋友可以参考下
    2016-07-07
  • Go语言Goroutinue和管道效率详解

    Go语言Goroutinue和管道效率详解

    这篇文章主要为大家介绍了Go语言Goroutinue和管道效率使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 详解Go语言各种常见类型的默认值和判空方法

    详解Go语言各种常见类型的默认值和判空方法

    本文主要介绍了详解Go语言各种常见类型的默认值和判空方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • go语言yaml转map、map遍历的实现

    go语言yaml转map、map遍历的实现

    本文主要介绍了go语言yaml转map、map遍历的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • GO语言并发编程之互斥锁、读写锁详解

    GO语言并发编程之互斥锁、读写锁详解

    这篇文章主要介绍了GO语言并发编程之互斥锁、读写锁详解,本文是GO并发编程实战一书的样章,详细讲解了互斥锁、读写锁,然后给出了一个完整示例,需要的朋友可以参考下
    2014-11-11
  • Go如何实现Websocket服务以及代理

    Go如何实现Websocket服务以及代理

    这篇文章主要介绍了Go如何实现Websocket服务以及代理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • golang不到30行代码实现依赖注入的方法

    golang不到30行代码实现依赖注入的方法

    这篇文章主要介绍了golang不到30行代码实现依赖注入的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • go mod tidy报错:zip: not a valid zip file解决办法

    go mod tidy报错:zip: not a valid zip file解决办法

    这篇文章主要给大家介绍了关于go mod tidy报错:zip: not a valid zip file的解决办法,go mod是进行代码管理,这错误是因为本地分支和远程分支冲突,本文通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Golang HTML 模板使用指南示例详解

    Golang HTML 模板使用指南示例详解

    本文详细介绍了Golang HTML模板的使用方法,包括基础模板、高级模板、完整应用示例、CSS样式、JavaScript交互等,文章强调了模板组织、代码复用、语义化HTML、响应式设计、性能优化等最佳实践,感兴趣的朋友跟随小编一起看看吧
    2025-01-01

最新评论