GO语言
01GO基础-001GO语言简介
01GO基础-002语言环境安装
01GO基础-003Go 语言结构
01GO基础-004Go 语言基础语法1
01GO基础-004Go 语言基础语法2
01GO基础-004Go 语言基础语法3
01GO基础-005Go 语言数据类型
01GO基础-006Go 语言变量
01GO基础-007Go 语言常量
01GO基础-008Go 语言运算符
01GO基础-009条件语句
01GO基础-010循环语句
01GO基础-011函数
01GO基础-012变量作用域
01GO基础-013数组
01GO基础-014指针
01GO基础-015结构体
01GO基础-016切片
01GO基础-017范围(Range)
01GO基础-018Map
01GO基础-019递归函数
01GO基础-020类型转换
01GO基础-021接口
01GO基础-022异常处理
01GO基础-023并发
01GO基础-024strings
01GO基础-025可变参数
01GO基础-026接口2
01GO基础-027异常处理2
01GO基础-028sync包详解
01GO基础-029Context
02GO进阶001包
02GO进阶002init()函数
02GO进阶003包的注意点
02GO进阶003使用go module导入本地包
02GO进阶004 time包
02GO进阶005 file操作
02GO进阶006 io操作
02GO进阶007 os包(文件 I/O、文件属性、目录与链接、创建和移除链接)
02GO进阶008复制文件
02GO进阶009断点续传
02GO进阶010 bufio包
02GO进阶011ioutil包
02GO进阶012遍历文件夹
02GO进阶013并发编程介绍
02GO进阶014Goroutine协程
02GO进阶015 GPM
02GO进阶016 runtime包
02GO进阶017 Channel
02GO进阶018 Goroutine池
02GO进阶019 定时器
02GO进阶020 select
02GO进阶021并发安全和锁
02GO进阶022sync
02GO进阶023原子操作
02GO进阶024 GMP原理与调度
02GO进阶025爬虫小案例
02GO进阶026 面向对象-匿名字段
02GO进阶026 面向对象-接口
02GO进阶027网络编程-互联网协议介绍
02GO进阶027网络编程-socket
02GO进阶027网络编程-http编程
02GO进阶027网络编程-websocket编程
02GO进阶028数据操作-MYSQL
02GO进阶028数据操作-REDIS
02GO进阶028数据操作-RTCD
02GO进阶028数据操作-ZOOKEEPER
02GO进阶028数据操作-KAFKA
02GO进阶028数据操作-RabbitMQ
02GO进阶028数据操作-ElasticSearch
02GO进阶028数据操作-NSQ
02GO进阶028数据操作-memcached
02GO进阶028数据操作-GORM
02GO进阶029beego框架-安装
02GO进阶029beego框架-快速入门
02GO进阶029beego框架-MVC架构介绍-controller设计-参数配置
02GO进阶029beego框架-MVC架构介绍-controller设计-路由设置
02GO进阶029beego框架-MVC架构介绍-controller设计-控制器函数
02GO进阶029beego框架-MVC架构介绍-controller设计-XSRF过滤
02GO进阶029beego框架-MVC架构介绍-controller设计-请求数据处理
02GO进阶029beego框架-MVC架构介绍-controller设计-Session控制
02GO进阶029beego框架-MVC架构介绍-controller设计-过滤器
02GO进阶029beego框架-MVC架构介绍-controller设计-Flash数据
02GO进阶029beego框架-MVC架构介绍-controller设计-URL构建
02GO进阶029beego框架-MVC架构介绍-controller设计-多种格式数据输出
02GO进阶029beego框架-MVC架构介绍-controller设计-表单数据验证
02GO进阶029beego框架-MVC架构介绍-controller设计-错误处理
02GO进阶029beego框架-MVC架构介绍-controller设计-日志处理
02GO进阶029beego框架-MVC架构介绍-model设计-概述
02GO进阶029beego框架-MVC架构介绍-model设计-CRUD操作
02GO进阶029beego框架-MVC架构介绍-model设计-高级查询
02GO进阶029beego框架-MVC架构介绍-model设计-原生SQL查询
02GO进阶029beego框架-MVC架构介绍-model设计-构造查询
02GO进阶029beego框架-MVC架构介绍-model设计-事务处理
02GO进阶029beego框架-MVC架构介绍-model设计-模型定义
02GO进阶029beego框架-MVC架构介绍-model设计-命令模式
02GO进阶029beego框架-MVC架构介绍-model设计-测试用例
02GO进阶029beego框架-MVC架构介绍-view设计-beego 模板语法指南
02GO进阶029beego框架-MVC架构介绍-view设计-模板处理
02GO进阶029beego框架-MVC架构介绍-view设计-其他
本文档使用 MrDoc 发布
-
+
首页
02GO进阶003使用go module导入本地包
`go module`是Go1.11版本之后官方推出的版本管理工具,并且从`Go1.13`版本开始,`go module`将是Go语言默认的依赖管理工具。最近`Go1.14`版本推出之后`Go module` 功能已经被正式推荐在生产环境下使用了。 这几天已经有很多教程讲解如何使用`go module`,以及如何使用`go module`导入gitlab私有仓库,我这里就不再啰嗦了。 最近我发现很多小伙伴在群里问如何使用go module导入本地包,毕竟初学者刚开始接触package概念的时候都是先在本地创建一个包,然后尝试本地调用一下,但是在go module模式下调用本地包就很容易被卡住了。 本文就详细介绍下如何使用go module导入本地包。 ## 前提 假设我们现在有`moduledemo`和`mypackage`两个包,其中`moduledemo`包中会导入`mypackage`包并使用它的`New`方法。 `mypackage/mypackage.go`内容如下: ```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中按如下定义: ```shell module moduledemo go 1.14 ``` 然后在moduledemo/main.go中按如下方式导入mypackage ```go 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内容如下: ```shell module github.com/q1mi/bubble go 1.14 ``` bubble/dao/mysql.go内容如下: ```go package dao import "fmt" func New(){ fmt.Println("mypackage.New") } ``` bubble/main.go内容如下: ```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文件,内容如下: ```shell module mypackage go 1.14 ``` 然后我们在moduledemo/main.go中按如下方式导入: ```go import ( "fmt" "mypackage" ) func main() { mypackage.New() fmt.Println("main") } ``` 因为这两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod文件中使用replace指令。 在调用方也就是packagedemo/go.mod中按如下方式指定使用相对路径来寻找mypackage这个包。 ```shell 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内容如下: ```shell module liwenzhou.com/q1mi/p2 go 1.14 ``` p1/main.go中按如下方式导入 ```go import ( "fmt" "liwenzhou.com/q1mi/p2" ) func main() { p2.New() fmt.Println("main") } ``` 因为我并没有把liwenzhou.com/q1mi/p2 这个包上传到liwenzhou.com这个网站,我们只是想导入本地的包,这个时候就需要用到replace这个指令了。 p1/go.mod内容如下: ```shell module github.com/q1mi/p1 go 1.14 require "liwenzhou.com/q1mi/p2" v0.0.0 replace "liwenzhou.com/q1mi/p2" => "../p2" ``` 此时,我们就可以正常编译p1这个项目了。 说再多也没用,赶快自己动手试试吧。
admin
2024年12月24日 11:42
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码