【问题标题】:Inserting Missing value NOT working GoLang插入缺失值不起作用 GoLang
【发布时间】:2014-07-18 06:30:27
【问题描述】:

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

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

【问题讨论】:

    标签: go slice


    【解决方案1】:

    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]++
        }
    }
    

    切片参数的内容可以被函数修改,但是它的header不能

    通过这样做

    slice = append(slice, i)
    

    修改标题,将生成的切片重新分配到一个完全不同的数组。
    这在函数之外是不可见的。

    【讨论】:

    • 感谢您的新见解!
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多