【问题标题】:Changing a slice by passing its pointer通过传递其指针来更改切片
【发布时间】:2014-11-12 04:09:58
【问题描述】:

我有一个要使用函数更改的切片(例如,我想删除第一个元素)。我想使用指针,但我仍然无法索引它。我做错了什么?

Playground link:

func change(list *[]int) {
    fmt.Println(*list)
    *list = *list[1:] //This line screws everything up
}

var list = []int{1, 2, 3}

func main() {
    change(&list)
}

【问题讨论】:

    标签: pointers go slice


    【解决方案1】:

    您需要使用(*list)

    func change(list *[]int) {
        *list = (*list)[1:]
    }
    

    或者另一种通常更符合当地习惯的方法:

    func change(list []int) []int {
        return list[1:]
    }
    

    playground

    【讨论】:

    • +1。无论如何,切片都是“引用类型”。因此,通过传递指针并尝试就地修改它并没有真正获得太多。
    • @SimonWhitehead 有实际用途。请参阅:play.golang.org/p/vf1tD7_xc7 以获取使用切片表示创建队列的示例。
    • 感谢@dyoo 的示例。我同意在某些特定情况下它是有意义的(例如您示例中别名类型的指针接收器)。不过,我认为它不适用于 OP 的情况(这是我的评论目标)。
    • @DewyBroto 我知道这一点。我不是在争论什么是更惯用的:)
    • @SimonWhitehead:“因此,通过传递指针并尝试对其进行修改,您并没有真正获得太多收益。”他正试图改变切片的长度。他通过传递指针获得一切,因为您必须替换切片值以具有不同的长度。
    猜你喜欢
    • 1970-01-01
    • 2018-08-19
    • 2016-10-27
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2023-03-03
    相关资源
    最近更新 更多