Skip to main content

receiver Sort

为什么排序的接受者是值类型?

在 Go 中,排序的接受者可以是值类型,因为切片本身包含了指向底层数组的指针。即使方法的接收者是值类型,修改切片的元素仍然会影响到原始数据。

具体原因:

  1. 切片的结构:切片包含指向底层数组的指针、长度和容量。即使切片被按值传递,底层数组仍然是共享的。

  2. 修改元素:在 Swap 方法中,交换切片元素实际上是修改底层数组的内容,因此即使接收者是值类型,修改仍然会反映在原始切片上。

  3. 效率:使用值类型接收者避免了不必要的指针传递,简化了代码,同时仍然保持了对底层数据的修改能力。

因此,使用值类型接收者在这种情况下是合理的选择。

package main

import (
"fmt"
"sort"
)

type byLength []string

func (s byLength) Len() int {
return len(s)
}
func (s byLength) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
return len(s[i]) < len(s[j])
}

func main() {
fruits := []string{"peach", "banana", "kiwi"}
sort.Sort(byLength(fruits))
fmt.Println(fruits)
}

为什么排序的接受者是值类型