关于Go中`slice`和`append`的问题

Zhe*_*hen 9 go

我写了以下代码.但我不能编译.这是我的代码:

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
}
Run Code Online (Sandbox Code Playgroud)

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

但如果我替换append(res, functionx(i))(第21行)res = append(res, functionx(i)),它的效果非常好.有谁能够帮我?

谢谢!

pet*_*rSO 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)
}
Run Code Online (Sandbox Code Playgroud)

输出:

[0 1]
[0 1]
[0 1 2]
Run Code Online (Sandbox Code Playgroud)