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 文件,最后重新编译工程你会发现编译错误消失了

转自:https://learnku.com/articles/48872