• 使用Go module导入本地包


    4.1. 前提

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

    mypackage/mypackage.go内容如下:

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

    现在分两种情况讨论:(1)同一个项目;(2)不同项目;

    4.2. 同一个项目下

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

    4.2.1 目录结构

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

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

    4.2.2 导入包

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

    module moduledemo
    
    go 1.15
    

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

    package main
    
    import (
        "fmt"
        "moduledemo/mypackage"  // 导入同一项目下的mypackage包
    )
    func main() {
        mypackage.New()
        fmt.Println("main")
    }
    

    4.2.3 举个例子

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

    └── 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")
    }
    

    4.3.不 同项目下

    4.3.1 目录结构

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

    4.3.2 导入包

    这个时候,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指令。

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

    module moduledemo
    
    go 1.14
    
    require "mypackage" v0.0.0
    replace "mypackage" => "../mypackage"
    

    4.3.3 举个例子

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

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

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

    p2/go.mod内容如下:

    module xiaoliu.com/q1mi/p2
    
    go 1.14
    

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

    import (
        "fmt"
        "xiaoliu.com/q1mi/p2"
    )
    func main() {
        p2.New()
        fmt.Println("main")
    }
    

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

    p1/go.mod内容如下:

    module github.com/q1mi/p1
    
    go 1.14
    
    require "xiaoliu.com/q1mi/p2" v0.0.0
    replace "xiaoliu.com/q1mi/p2" => "../p2"
    

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



    作者:YY_LL
    链接:https://www.jianshu.com/p/01151b8c2cdf

  • 相关阅读:
    听豆瓣架构变迁分享会总结
    业界对生成图片缩略图的做法归纳
    58和百姓网的技术学习
    减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同
    网站速度问题排查与定位经验
    调度思想-现实中的事物与技术里面其实存在类似道理
    关于图片或者文件在数据库的存储方式归纳
    mysql单表体积和一个库设计多少张表为妥
    php的变量引用与销毁机制
    选择技术方案权衡时,考虑对其可控性很重要
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/15248148.html
Copyright © 2020-2023  润新知