本文详解如何在 go 中依据一个参考切片(如权重或优先级)对目标切片进行稳定重排,指出常见错误(如忽略辅助切片同步交换),并提供可直接运行的完整示例与最佳实践。
在 Go 中,若需根据另一个切片(例如 other_slice)的值顺序来重排主切片(main_slice),核心思路是:将两切片视为绑定的“键值对”,通过索引关联,并在排序过程中同步操作二者。常见误区是仅交换主切片元素,却忽略参考切片的对应位置更新——这会导致索引错位,最终排序结果错误。
你提供的代码中,Swap 方法只交换了 main_slice 的元素,而未同步交换 other_slice 的对应元素。这破坏了两切片之间的原始索引映射关系。当 sort.Sort 执行多次交换后,other_slice[i] 不再代表原 main_slice[i] 的权重,因此 Less 比较失去意义,导致输出 [1 3 2 4 5] 而非预期的 [3 4 1 2 5]。
✅ 正确做法是:在 Swap 中同时交换两个切片的对应元素。以下是修正后的完整可运行示例:
package main
import (
"fmt"
"sort"
)
type TwoSlices struct {
main_slice []int
ot
her_slice []int
}
type SortByOther TwoSlices
func (sbo SortByOther) Len() int { return len(sbo.main_slice) }
func (sbo SortByOther) Swap(i, j int) {
sbo.main_slice[i], sbo.main_slice[j] = sbo.main_slice[j], sbo.main_slice[i]
sbo.other_slice[i], sbo.other_slice[j] = sbo.other_slice[j], sbo.other_slice[i] // ✅ 关键修复
}
func (sbo SortByOther) Less(i, j int) bool { return sbo.other_slice[i] < sbo.other_slice[j] }
func main() {
my_other_slice := []int{3, 5, 1, 2, 7}
my_main_slice := []int{1, 2, 3, 4, 5} // 期望按 other_slice 升序排列后:[3,4,1,2,5]
fmt.Println("Before: main =", my_main_slice, "| other =", my_other_slice)
sort.Sort(SortByOther{main_slice: my_main_slice, other_slice: my_other_slice})
fmt.Println("After: main =", my_main_slice, "| other =", my_other_slice)
// 输出:After: main = [3 4 1 2 5] | other = [1 2 3 5 7]
}? 注意事项与进阶建议:
indices := make([]int, len(other_slice))
for i := range indices { indices[i] = i }
sort.Slice(indices, func(i, j int) bool {
return other_slice[indices[i]] < other_slice[indices[j]]
})
sortedMain := make([]int, len(main_slice))
for i, idx := range indices {
sortedMain[i] = main_slice[idx]
}总结:按参考切片排序的本质是维护索引一致性;Swap 必须双切片同步更新,否则排序逻辑失效。掌握此模式,即可灵活实现多维数据联动排序。
# go
# ai
# 键值对
# 排列
# less
# sort
# 封装
# 泛型
# 闭包
# 切片
# 多维
# 进阶
# 升序
# 推荐使用
# 并在
# 换了
# 可直接
# 而非
# 若不
# 这会
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
如何用::实现单例模式_php静态方法与作用域操作符应用【技巧】
如何使用Golang处理静态文件缓存_提高页面加载速度
Windows10任务栏图标变成白色文件_Win10重建图标缓存修复方法
Win11系统更新后黑屏怎么办 Win11更新黑屏修复教程【方法】
Win11怎样彻底卸载自带应用_Win11彻底卸载自带应用方法【步骤】
如何减少Golang内存碎片化_Golang内存分配与回收优化方法
VSC里PHP变量未定义报错怎么解决_错误抑制技巧【解答】
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
C++如何使用std::optional?(处理可选值)
Linux如何安装Golang环境_Linux下Go语言开发包配置【方法】
Windows10如何重置此电脑_Windows10电脑重置方法【步骤】
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
Windows7如何安装系统镜像_Windows7系统安装教程【步骤】
MAC如何快速搜索大文件_MAC磁盘空间分析与冗余数据清理【方法】
Mac系统更新下载慢或失败怎么办_解决macOS升级问题【方法】
php错误怎么开启_display_errors与log_errors的设置【汇总】
为什么Go建议使用error接口作为错误返回_Go Error接口设计原因说明
如何使用Golang benchmark测量函数延迟_统计执行耗时
如何在 Go 中调用动态链接库(.so)中的函数
Windows如何设置登录时的欢迎屏幕背景?(锁屏界面)
Win11怎么查看电脑配置_Win11硬件配置详细查询方法【详解】
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
Linux怎么查找死循环进程_Linux系统负载分析与进程彻底结束【教程】
Win10系统字体模糊怎么办_Windows10高级缩放设置修复
Go语言中CookieJar的持久化机制解析:内存存储与自定义持久化方案
Go语言中slice追加操作的底层共享机制详解
如何使用Golang指针与接口结合_实现方法调用和动态类型
Python日志系统设计与实现_高可观测性架构实战
c++如何利用doxygen生成开发文档_c++ 代码注释规范与HTML文档导出【案例】
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】
php485读数据时阻塞怎么办_php485非阻塞读取设置技巧【详解】
Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】
Win11开机Logo怎么换_Win11自定义启动画面工具【高级】
Win11怎么忘记WiFi网络_Win11删除已保存无线连接【教程】
如何使用Golang table-driven fuzz测试_多数据随机化发现缺陷
c++中的Tag Dispatching是什么_c++利用标签分发优化函数重载【元编程】
C#怎么使用委托和事件 C# delegate与event编程方法
Python邮件系统自动化教程_批量发送解析与模板应用
静态属性修改会影响所有实例吗_php作用域操作符下静态存储【教程】
如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)
如何使用Golang实现基本类型比较_Golang比较操作符使用方法
Windows10系统怎么查看已安装更新_Win10控制面板卸载补丁
Win10怎么卸载剪映_Win10彻底卸载剪映方法【步骤】
Win10怎样清理C盘爱奇艺缓存_Win10清理爱奇艺缓存步骤【步骤】
Win11时间格式怎么改成12小时制 Win11时间格式切换教程【步骤】
英国搜索:多数英国人认为语言搜索是未来搜索
Win11怎样激活系统密钥_Win11系统密钥激活步骤【攻略】
c# 如何深拷贝和浅拷贝
Win11怎么恢复出厂设置_Win11重置此电脑保留文件方法【详解】
2026-01-04
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。