zoukankan      html  css  js  c++  java
  • 使用go module导入本地包

    使用go module导入本地包

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

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

    前提

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

    mypackage/packageDemo.go内容如下:

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

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

    在同一个项目下

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

    目录结构

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

    moduleDemo
    ├── go.mod
    ├── main.go
    └── mypackage
        └── packageDemo.go
    

    go mod模式

    go mod init moduleDemo 
    

    注:init初始化的名字, 在导入包时候是以init 后面的名字为基准开始导包

    image-20210930082313883

    导入包

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

    module moduleDemo
    
    go 1.17
    
    

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

    package main
    
    import (
    	"fmt"
    	"moduleDemo/mypackage" // 导入同一项目下的mypackage包
    )
    
    /*
    @author RandySun
    @create 2021-09-30-8:47
    */
    func main() {
    	mypackage.New()
    	fmt.Println("main")
    }
    
    

    举个例子

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

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

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

    go mod init github.com/randysun/bubble

    
    module github.com/randysun/bubble
    
    go 1.17
    
    

    image-20210930085702476

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

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

    bubble/main.go内容如下:

    package main
    
    import (
    	"fmt"
    	"github.com/randysun/bubble/dao"
    )
    
    /*
    @author RandySun
    @create 2021-09-30-8:56
    */
    func main() {
    	dao.New()
    	fmt.Println("main")
    }
    

    image-20210930085843356

    不在同一个项目下

    目录结构

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

    导入包

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

    module mypackage
    
    go 1.17
    
    

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

    package main
    
    import (
    	"fmt"
    	"mypackage"
    )
    
    /*
    @author RandySun
    @create 2021-09-30-8:47
    */
    func main() {
    	mypackage.New()
    	fmt.Println("main")
    }
    
    

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

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

    module moduleDemo
    
    go 1.17
    require "mypackage" v0.0.0
    replace "mypackage" => "../mypackage"
    

    image-20210930090709349

    举个例子

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

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

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

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

    p2/go.mod内容如下:

    module randy.com/randysun/p2
    
    go 1.17
    

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

    import (
    	"fmt"
    	"randy.com/randysun/p2"
    )
    func main() {
    	p2.New()
    	fmt.Println("main")
    }
    

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

    p1/go.mod内容如下:

    module github.com/randysun/p1
    
    go 1.17
    
    
    require "randy.com/randysun/p2" v0.0.0
    replace "randy.com/randysun/p2" => "../p2"
    

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

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    JAVA---File递归遍历文件目录,输出绝对路径
    JAVA--Map集合
    (笔记)JAVA--集合实现斗地主洗牌、发牌、看牌(利用TreeSet排序)
    SVN简单使用
    System.Object
    动态创建控件
    select 查询
    数据类型
    入门(值得注意的地方)
    错误调式 异常处理
  • 原文地址:https://www.cnblogs.com/randysun/p/15399911.html
Copyright © 2011-2022 走看看