golang 官方快排的一个坑

原创
2022/02/21 18:22
阅读数 133

golang 的快排在排序前并不会检查当前 slice 是否已经有序,例如:

package main

import (
	"sort"
)

func main() {
	s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
	sort.Ints(s)
}

在 swap 处打断点(/usr/lib/go/src/sort/sort.go):

type IntSlice []int

func (x IntSlice) Len() int           { return len(x) }
func (x IntSlice) Less(i, j int) bool { return x[i] < x[j] }
func (x IntSlice) Swap(i, j int)      { x[i], x[j] = x[j], x[i] } // breakpoint

debug 并执行一次单步跳过就可以看到 slice 发生了变化:

所以在使用 sort 时一定要考虑并发问题。即使是有序的,排序过程可能会破坏有序性。

展开阅读全文
go
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部