我尝试插入一个Int值到切片中,如果它在该切片中缺失。
我的代码:
package main
import (
"fmt"
)
func AppendIfMissing(slice []int, i int) []int {
for _, ele := range slice {
if ele == i {
fmt.Println(i)
return slice
}
}
fmt.Println("i value is ", i)
slice = append(slice, i)
return slice
}
func main() {
slice1 := []int{1, 2, 3, 4}
AppendIfMissing(slice1, 60)
fmt.Println("slice after adding :", slice1)
}
输出:
i value is 60
slice after adding : [1 2 3 4]
没有追加到切片。我的代码有什么问题?
2条答案
按热度按时间6yt4nkrj1#
AppendIfMissing
将需要影响的切片返回给变量。append(slice, i)
创建了一个新的切片,这意味着参数切片没有被修改,它引用了一个全新的切片:请参阅go playground example。
我同意文章“Arrays, slices (and strings): The mechanics of '
append
'“提到即使片段信头是以传值方式传递,信头也会包含数组元素的指标,因此原始片段信头和传递至函式的信头复本都会描述相同的数组。
因此,当函数返回时,可以通过原始切片变量看到修改的元素。
但是,这篇文章中的函数没有使用
append
:函数可以修改切片参数的 * 内容 *,但不能修改其 * 头 *
通过这样做
您修改了标头,就将结果切片重新分配到一个完全不同的数组中。
在函数之外是不可见的。
xxslljrj2#
AppendIfMissing的更通用版本,它需要go版本〉= 1.18