插入缺少的值不工作GoLang

插入缺少的值不工作GoLang,go,slice,Go,Slice,我试图插入一个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.Prin

我试图插入一个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]

没有追加到切片。我的代码有什么问题?

AppendIfMissing
返回需要影响变量的切片。
append(slice,i)
创建一个新的slice,这意味着参数slice没有被修改,它指的是一个全新的slice:

  • 在最后返回
  • 这需要影响到一个变量

    slice1 = AppendIfMissing(slice1, 60)
    


我同意文章“”提到

即使切片标头是按值传递的,标头也包含指向数组元素的指针,因此传递给函数的原始切片标头和标头副本都描述了同一数组。
因此,当函数返回时,可以通过原始slice变量查看修改后的元素

但是那篇文章中的函数没有使用
append

func AddOneToEachElement(slice []byte) {
    for i := range slice {
        slice[i]++
    }
}
函数可以修改切片参数的内容,但不能修改其标头

通过这样做

slice = append(slice, i)
修改标头后,将生成的切片重新分配到完全不同的数组。

这在函数外部是看不见的。

感谢您的新见解!!