go mod管理依赖包中有etcd时会出现异常报错:
go: dse/pkg/component/cache imports
go.etcd.io/etcd/clientv3 tested by
go.etcd.io/etcd/clientv3.test imports
github.com/coreos/etcd/auth imports
github.com/coreos/etcd/mvcc/backend imports
github.com/coreos/bbolt: github.com/coreos/bbolt@v1.3.6: parsing go.mod:
module declares its path as: go.etcd.io/bbolt
but was required as: github.com/coreos/bbolt
原因主要是etcd中使用的bbolt和grpc版本冲突引起
删除原go.mod和go.sum
注意: 这里记得版本要是v1.2.3格式的,一开始忘记v直接写版本号1.3.6导致错误。
go mod init
go mod edit -replace github.com/coreos/bbolt@v1.3.6=go.etcd.io/bbolt@v1.3.6
go mod tidy
或者直接修改go.mod
replace github.com/coreos/bbolt v1.3.6 => go.etcd.io/bbolt v1.3.6
上面链接是修改了etcd和grpc两项,我这只修改etcd就不报错了。下面是链接的修改方式:
go mod init
go mod edit -replace github.com/coreos/bbolt@v1.3.4=go.etcd.io/bbolt@v1.3.4
go mod edit -replace google.golang.org/grpc@v1.29.1=google.golang.org/grpc@v1.26.0
go mod tidy
这需要用到 go mod 的 replace 来调整,具体就是往 go.mod 插入一条记录。
replace github.com/coreos/bbolt v1.3.4 => go.etcd.io/bbolt v1.3.4
很神奇,replace 两次就好了,具体原因待排查。
go mod edit -replace=go.etcd.io/bbolt@v1.3.4=github.com/coreos/bbolt@v1.3.4
其实就会在 go.mod 文件插入两行。
replace github.com/coreos/bbolt v1.3.4 => go.etcd.io/bbolt v1.3.4
replace go.etcd.io/bbolt v1.3.4 => github.com/coreos/bbolt v1.3.4
不得不吐槽一下etcd 使用坑是真的多。
etcd报错
invalid operation: ev.Type == "go.etcd.io/etcd/mvcc/mvccpb".DELETE
(mismatched types "github.com/coreos/etcd/mvcc/mvccpb".Event_EventType
and "go.etcd.io/etcd/mvcc/mvccpb".Event_EventType)
invalid operation: ev.Type == "go.etcd.io/etcd/mvcc/mvccpb".PUT
(mismatched types "github.com/coreos/etcd/mvcc/mvccpb".Event_EventType
and "go.etcd.io/etcd/mvcc/mvccpb".Event_EventType)
go run 运行的时候报错, 解决方法是修改自己代码引入的包
import 的 go.etcd.io/etcd/clientv3 引用的是 go.etcd.io/etcd/mvcc/mvccpb,
但是在
(if ev.Type == mvccpb.DELETE) 和
(if ev.Type == mvccpb.PUT && string(ev.Kv.Key) == key)
应用了 github.com/coreos/etcd/mvcc/mvccpb
自己代码里全部改成 github.com/coreos/etcd/mvcc/mvccpb
报错package xxx is not in GOROOT or GOPATH 或者 cannot find package “xxx“ in any of
我要迁移,肯定是要开GO111MODULE="on" 这种方式
随便找个文件夹创建work文件夹,同层创建demo和utils文件夹,在demo中再创建modol文件夹
modol.go
package modol
import "fmt"
func Hello(str string) {
fmt.Println("model hello: ", str)
}
utils.go
package utils
import "fmt"
func SayHello(str string) string {
fmt.Println("utils SyaHello")
return fmt.Sprintf("Hello: %s", str)
}
现在我们要在main.go中使用自己项目下的包modol,以及使用同层级的utils包。
go mod init utils
内容为
module utils
go 1.18
go mod init demo
这个时候demo/modol包就已可以使用,但是同层级的utils还不能用
demo/go.mod
module demo
go 1.18
require "utils" v0.0.0
replace "utils" => "../utils"
定义uilts包版本,然后定义引用路径
package main
import (
"fmt"
"demo/modol"
"utils"
)
func main() {
fmt.Println("Hello Main")
modol.Hello("xx")
utils.SayHello("Tom")
}
// Hello Main
// model hello: xx
// utils SyaHello
本项目下包使用定义的module名字/包名(demo/modol)
同层包需要自定义包名和路径。
git 上下载的包报这个错
原因是本地使用的go版本是go1.15.2 需要升级到go1.17解决问题。
golang not enough arguments in call to uuid.Must
satori/go.uuid作者提交了个更新,方法参数有变化,导致调用不了
一种是使用这个替换版本 https://github.com/gofrs/uuid, 修改vendor
如D:\go_workspace_test\goa.demo.calculator\vendor\github.com\goadesign\goa\uuid\uuid.go
修改导包
import uuid "github.com/gofrs/uuid"
//import uuid "github.com/satori/go.uuid"
一种就使用google uuid ,