You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:13:16