9

我已经编写了以下代码。但我无法编译它。这是我的代码:

package main

import "fmt"

func main() {
    tmp := make([]int, 10)
    for i := 0; i < 10; i++ {
        tmp[i] = i
    }
    res := mapx(foo, tmp)
    fmt.Printf("%v\n", res)
}

func foo(a int) int {
    return a + 10
}

func mapx(functionx func(int) int, list []int) (res []int) {
    res = make([]int, 10)
    for _, i := range(list) {
        append(res, functionx(i))
    }
    return
}

同时错误信息也很混乱: prog.go:21: append(res, functionx(i)) not used

但是,如果我将append(res, functionx(i))(第 21 行)替换为res = append(res, functionx(i)),则效果很好。有谁能够帮助我?

谢谢!

4

1 回答 1

30

追加和复制切片

可变参数函数 append 将零个或多个值 x 附加到类型 S 的 s 中,它必须是一个切片类型,并返回结果切片,也是 S 类型。

如果 s 的容量不足以容纳附加值,则 append 分配一个新的、足够大的片,该片既适合现有的片元素又适合附加值。因此,返回的切片可能引用不同的底层数组。

来电

在函数调用中,函数值和参数按通常的顺序计算。在它们被评估之后,调用的参数按值传递给函数,被调用的函数开始执行。函数的返回参数在函数返回时按值传回调用函数。

在 Go 中,参数是按值传递的。

您需要编写res = append(res, functionx(i))以免丢弃 res 的新值,它指的是不同的切片,并且可能是不同的底层数组。

例如,

package main

import "fmt"

func main() {
    res := []int{0, 1}
    fmt.Println(res)
    _ = append(res, 2) // discard
    fmt.Println(res)
    res = append(res, 2) // keep
    fmt.Println(res)
}

输出:

[0 1]
[0 1]
[0 1 2]
于 2012-05-24T15:20:52.647 回答