go项目使用Go module导入本地包示例

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

mypackage/mypackage.go内容如下:

package mypackage

import "fmt"

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

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

(1)同一个项目下

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

目录结构

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

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

导入包

这个时候,我们需要在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")
}

举个例子

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

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

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

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指令。

在调用方也就是moduledemo/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 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这个项目了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

php、go编程学习实例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值