go mod模式下引用本地包/模块(module)的方法


go mod 的模式, 可以管理包/模块的依赖关系, 从go1.16开始,会自动开启.
这个跟GOPATH的模式区别很大, 在引用本地包/模块(module)的时候,我们可以采用本文描述的办法.

样例目录结构

go
└─src
   ├── audio-websocket
   │   ├── go.mod
   │   ├── go.sum
   │   ├── README.md
   │   └── main.go
   └── utils@v0.0.0
       ├── go.mod
       ├── utils.go
       └── utils_test.go

建立本地module的方式

创建本地模块并初始化

mkdir utils@v0.0.0
cd utils@v0.0.0

# init的模块名中必须包含小数点, 可用github.com或自己的域名
go mod init huzhenwei.top/utils
# 这个命令会在当前目录创建一个名为go.mod的文件, 在本文中不会修改它的内容

本地模块golang源码如下:

package utils

import (
	"crypto/rand"
	"encoding/hex"
	"strconv"
	"time"
)

// UnixTimeUniqueID 返回一个"unix时间和n*2长度的唯一码"字符串
func UnixTimeUniqueID(n uint16) string {
	b := make([]byte, n) //8 character
	if _, err := rand.Read(b); err != nil {
		panic(err)
	}

	t := time.Now().Unix()
	return strconv.FormatInt(t, 10) + "-" + hex.EncodeToString(b)
}

调用本地module的方式

例如audio-websocket要调用上述本地module, 需在audio-websocket/go.mod增加如下内容:

# 在go.mod中增加这两条内容就能调用huzhenwei.top/utils这个本地module了
require huzhenwei.top/utils v0.0.0
replace huzhenwei.top/utils v0.0.0 => ../utils@v0.0.0

golang源码中的引用方式如下:

package main

import (
	...
	"path"
	"huzhenwei.top/utils"
	...
)
...
filePath := path.Join("/data/voices/", utils.UnixTimeUniqueID(4))
...

注意事项

  • 切换到go mod模式后, 原先基于GOPATH方式的模块引用可能会不正常, 可用如下命令关闭
# 关闭go mod
go env -w GO111MODULE=off
# 开启go mod
#go env -w GO111MODULE=on
  • 引用模块时如果提示verifying module: invalid GOSUMDB: malformed verifier id, 可尝试用如下方法关闭校验:
# 关闭GOSUMDB
go env -w GOSUMDB=""
# 没有问题时建议开启GOSUMDB
go env -w GOSUMDB="sum.golang.org"
  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值