2012-05-24 59 views
9

我寫了下面的代碼。但我不能編譯它。這裏是我的代碼:Go中的`slice`和`append`的問題

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

但是,如果我有res = append(res, functionx(i))替換append(res, functionx(i))(21號線),它工作得很好。有誰能夠幫助我?

謝謝!

回答

30

Appending to and copying slices

的可變參數函數追加追加零個或多個值x爲s S型的,它必須是一個切片類型,並返回生成的切片,也 類型的S.

如果s的容量不足以容納附加值,則 附加將分配一個新的足夠大的分片,該分片適合 現有切片元素和附加值。因此,返回的 切片可能指代不同的基礎陣列。

Calls

在一個函數調用,該函數值和參數在 通常的順序進行評估。評估完成後,呼叫 的參數將按值傳遞給函數,被調用的函數將開始執行 。當函數返回時,函數的返回參數通過值 傳回給調用函數。

在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]