修复数组替换中引用不正确的切片
Fixing improperly referenced slices in an array replacement
以下 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)
}
您在这里使用的不是数组,而是切片。通常,您不想处理指向切片的指针,因为它会变得笨拙,并且在极少数情况下需要指针。
要修复您的错误,取消引用 x
:
*x = append((*x)[:remove], (*x)[remove+1:]...)
但您可能应该直接使用切片值,这样就不需要取消引用:
x := []int{11, 22, 33, 44, 55, 66, 77, 88, 99}
以下 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)
}
您在这里使用的不是数组,而是切片。通常,您不想处理指向切片的指针,因为它会变得笨拙,并且在极少数情况下需要指针。
要修复您的错误,取消引用 x
:
*x = append((*x)[:remove], (*x)[remove+1:]...)
但您可能应该直接使用切片值,这样就不需要取消引用:
x := []int{11, 22, 33, 44, 55, 66, 77, 88, 99}