Cosmos SDK与新版slices包编译失败及替换方案咨询
解决Cosmos SDK编译时slices包排序函数不兼容问题
问题根源
你遇到的编译错误是因为Go标准库slices包的API变更:旧版本slices.Sort接收的排序函数是返回bool的less函数(判断a是否应该排在b前面),而新版本改成了返回int的compare函数(返回负数/0/正数分别表示a小于/等于/大于b)。你使用的Cosmos SDK v0.47.3基于旧版slicesAPI编写,和当前Go版本不兼容。
解决方法
方法1:降级Go版本到兼容版本
Cosmos SDK v0.47.x官方要求的Go版本是1.20.x,该版本slices包仍使用返回bool的排序函数,与SDK代码完全兼容。执行以下命令降级:
go install golang.org/dl/go1.20.14@latest go1.20.14 download # 临时用该版本编译项目 GOVERSION=go1.20.14 go build # 若需设置为默认版本,可根据本地环境配置调整
方法2:修改Cosmos SDK源码适配新API
找到报错文件/root/go/pkg/mod/github.com/cosmos/cosmos-sdk@v0.47.3/runtime/services/reflection.go第60行,将返回bool的排序函数改为返回int的compare函数:
原代码示例:
slices.Sort(fileDescs, func(x, y *descriptorpb.FileDescriptorProto) bool { return x.GetName() < y.GetName() })
修改后:
slices.Sort(fileDescs, func(x, y *descriptorpb.FileDescriptorProto) int { if x.GetName() < y.GetName() { return -1 } else if x.GetName() > y.GetName() { return 1 } return 0 })
修改完成后执行go mod tidy重新拉取依赖并编译。
方法3:替换为sort包替代slices
如果不想修改SDK源码或降级Go版本,可将slices.Sort替换为标准库sort.Slice——它的API一直使用返回bool的less函数,兼容性更强:
sort.Slice(fileDescs, func(i, j int) bool { return fileDescs[i].GetName() < fileDescs[j].GetName() })
修改对应代码后重新编译即可。
内容的提问来源于stack exchange,提问作者najla chamseddine
相关产品推荐
相关产品推荐

