2012-05-24 2 views
9

私は次のコードを書いています。しかし、私はそれを編集することはできません。ここに私のコードは次のとおりです。 prog.go:21: append(res, functionx(i)) not usedGoの `slice`と` append`に関する問題

しかし、私はres = append(res, functionx(i))append(res, functionx(i))(ライン21)を交換した場合、それはかなりうまく機能:

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 
} 

一方、エラーメッセージも非常に紛らわしいです。誰か助けてくれますか?

ありがとうございました!

答えて

30

Appending to and copying slices

可変引数関数追記型でも、スライスタイプでなければならない タイプSのSにゼロ以上の値xを追加し、得られたスライスを返し、 S.

sの容量が追加の値に収まるのに十分でない場合、 appendは、 既存スライス要素と追加値の両方に適合する、十分に大きな新しいスライスを割り当てます。したがって、返された スライスは、別の基になる配列を参照することがあります。関数呼び出しで

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] 
関連する問題