【问题标题】:Fixing improperly referenced slices in an array replacement修复数组替换中引用不正确的切片
【发布时间】:2015-09-24 20:48:36
【问题描述】:

以下 go 代码无法编译,因为(我相信)指针被引用的方式存在错误。

特别是,错误信息是

prog.go:13: cannot use append((*x)[:remove], (*x)[remove + 1:]...) (type []int) as type *[]int in assignment

这是导致此错误消息的代码的抽象和简化版本。

package main

import "fmt"

func main() {

    x := &[]int{11, 22, 33, 44, 55, 66, 77, 88, 99}

    for i, addr := range *x {
        if addr == 22 {
            for len(*x) > 5 {
                remove := (i + 1) % len(*x)
                x = append((*x)[:remove], (*x)[remove+1:]...)
            }
            break
        }
    }

    fmt.Println(x)
}

【问题讨论】:

    标签: pointers go slice


    【解决方案1】:

    您在这里使用的不是数组,而是切片。通常,您不想处理指向切片的指针,因为它会变得笨拙,并且在极少数情况下需要指针。

    要修复您的错误,请取消引用 x

    *x = append((*x)[:remove], (*x)[remove+1:]...)
    

    但您可能应该直接使用切片值,因此不需要取消引用:

    x := []int{11, 22, 33, 44, 55, 66, 77, 88, 99}
    

    【讨论】:

    • 谢谢!你能举一个需要指向切片的指针的例子吗?
    • @jayunit100:如果您希望函数能够修改切片的长度或容量,则需要一个指针。你可以查看容器/堆包中的IntHeap example。 Push 和 Pop 方法需要一个指针接收器。
    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多