Go正确排序切片,但不排序数组

 mobiledu2502886333 发布于 2023-02-05 10:39

我很困惑为什么这段代码不起作用:

package main

import (
    "fmt"
    "sort"
)

type T [2]int

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

func main() {
    var x = [2]int{1, 0}
    fmt.Println(x)
    sort.Sort(T(x))
    fmt.Println(x)
}

它输出(错误):

[1 0]
[1 0]

将T的类型更改为切片是正确的.

1 个回答
  • 切片本质上是引用类型,这意味着切片头包含指向后备数组的指针,因此它们可以在没有指针接收器的情况下进行突变.调用方法时,完全复制不是引用类型的数组.

    为了使用数组执行此操作,您需要更改所有内容以使用指针,因此您的代码可能类似于:

    package main
    
    import (
        "fmt"
        "sort"
    )
    
    type T [2]int
    
    func (t *T) Len() int           { return len(t) }
    func (t *T) Swap(i, j int)      { t[i], t[j] = t[j], t[i] }
    func (t *T) Less(i, j int) bool { return t[i] < t[j] }
    
    func main() {
        var x = T([2]int{1, 0})
        fmt.Println(x)
        sort.Sort(&x)
        fmt.Println(x)
    }
    

    2023-02-05 10:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有