
这段代码尝试通过 *y[i+j] 来访问切片 y 的元素。然而,y 是一个指向切片的指针,*y 解引用后得到的是切片本身,而不是切片的某个元素。因此,不能直接对 *y 进行索引操作。
正确示例:解引用指针后访问切片元素
要正确地通过指针访问切片元素,需要先解引用指针,得到切片本身,然后再进行索引操作:
func conv(x []int, xlen int, h []int, hlen int, y_ *[]int) {
y := *y_ // 解引用指针,得到切片
for i := 0; i < xlen; i++ {
for j := 0; j < hlen; j++ {
y[i+j] += x[i] * h[j] // 正确:对切片进行索引
}
}
}在这个例子中,我们首先将 *y_ 赋值给 y,这样 y 就成为了一个切片,可以像普通切片一样进行索引操作。
最佳实践:直接使用切片作为参数
虽然可以通过指针操作切片,但在大多数情况下,直接使用切片作为函数参数是更推荐的做法。因为切片本身就是引用类型,传递切片并不会导致性能损失,而且代码也更加简洁易懂。
func conv(x []int, xlen int, h []int, hlen int, y []int) {
for i := 0; i < xlen; i++ {
for j := 0; j < hlen; j++ {
y[i+j] += x[i] * h[j] // 直接操作切片
}
}
}数组到切片的转换
如果需要将一个数组传递给一个接受切片作为参数的函数,可以使用切片表达式:
立即学习“go语言免费学习笔记(深入)”;
arr := [3]int{1, 2, 3}
s := arr[:] // 将数组转换为切片
func sum(a []int) int {
s := 0
for i := 0; i < len(a); i++ {
s += a[i]
}
return s
}
result := sum(s) // 将切片传递给函数arr[:] 创建了一个新的切片,它引用了整个数组 arr。这样,我们就可以将数组 arr 传递给 sum 函数,而无需使用指针。
总结
- Go语言的切片是引用类型。
- 避免直接通过指向切片的指针来访问元素,应该先解引用指针得到切片本身。
- 优先使用切片作为函数参数,而不是指向切片的指针。
- 可以使用切片表达式将数组转换为切片。
理解并正确使用切片,可以编写出更高效、更易读的Go代码。










