插入缺失值无法使用GoLang

ugmeyewa  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(152)

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

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

6yt4nkrj

6yt4nkrj1#

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

  • 在结尾返回
  • 需要被影响的变量
slice1 = AppendIfMissing(slice1, 60)

请参阅go playground example
我同意文章“Arrays, slices (and strings): The mechanics of ' append '“提到
即使片段信头是以传值方式传递,信头也会包含数组元素的指标,因此原始片段信头和传递至函式的信头复本都会描述相同的数组。
因此,当函数返回时,可以通过原始切片变量看到修改的元素。
但是,这篇文章中的函数没有使用append

func AddOneToEachElement(slice []byte) {
    for i := range slice {
        slice[i]++
    }
}

函数可以修改切片参数的 * 内容 *,但不能修改其 * 头 *
通过这样做

slice = append(slice, i)

您修改了标头,就将结果切片重新分配到一个完全不同的数组中。
在函数之外是不可见的。

xxslljrj

xxslljrj2#

AppendIfMissing的更通用版本,它需要go版本〉= 1.18

func AppendIfMissing[T comparable](slice []T, i T) []T {
    for _, ele := range slice {
        if ele == i {
            return slice
        }
    }
    return append(slice, i)
}

相关问题