golang 当中操作 etcd 必须 go get go.etcd.io/etcd/clientv3
但是会报错如下:
# github.com/coreos/etcd/clientv3/balancer/picker
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\picker\err.go:37:44: undefined: balancer.PickOptions
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\picker\roundrobin_balanced.go:55:54: undefined: balancer.PickOptions
# github.com/coreos/etcd/clientv3/balancer/resolver/endpoint
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:114:78: undefined: resolver.BuildOption
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:182:31: undefined: resolver.ResolveNowOption
大概是说原因是 google.golang.org/grpc 1.26 后的版本是不支持 clientv3 的。
也就是说要把这个改成 1.26 版本的就可以了。
第一种方式:
具体操作方法是在 go.mod 里加上:
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
如下图所示:
然后继续 go.etcd.io/etcd/clientv3 看是否还报错!
如果不行那你就尝试下边的
第二种方式:
更新 grpc 的版本为 1.26.0 版本试试看:
go get -u -x google.golang.org/grpc@v1.26.0
下载完成后将 grpc@v1.26.0"">$GOPATH/pkg/mod/google.golang.org/grpc@v1.26.0 文件重命名为 grpc ,并放到 $GOPATH/src/google.golang.org/grpc 目录下
=====================================================================
现在你去编译自己的 go 文件的时候可能会报错:
undefined: grpc.SupportPackageIsVersion6 grpc.ClientConnInterface 的问题
这是由于 protoc
的 go 语言插件 protoc-gen-go
与 google.golang.org/grpc 版本不兼容所致,
因为 grpc
降了到了 v1.26.0
,高版本 protoc-gen-go
编译出来的your-module.pb.go
不兼容低版本的 grpc
,
所以 protoc-gen-go
也要相应降级。
我使用二分法找到 protoc-gen-go
兼容 grpc v1.26.0
的最新版本是 v1.3.2
.
知道对应版本之后接下来就简单了,运行下面的命令获取该版本并编译二进制文件 GOPATH/bin/protoc-gen-go
go get github.com/golang/protobuf/protoc-gen-go@v1.3.2
重新编译 your.proto 生成 your-module.pb.go 文件,最后重新编译工程你会发现编译错误消失了