2012-05-24 7 views
9

J'ai écrit le code suivant. Mais je ne peux pas l'avoir compilé. Voici mon code:Problèmes concernant `slice` et` append` dans 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 
} 

Pendant ce temps le message d'erreur est aussi très confus: prog.go:21: append(res, functionx(i)) not used

Mais si je remplace append(res, functionx(i)) (ligne 21) avec res = append(res, functionx(i)), cela fonctionne très bien. Quelqu'un peut-il m'aider?

Merci!

Répondre

30

Appending to and copying slices

L'ajout de la fonction variadic ajoute zéro ou plusieurs valeurs x à s de de type S qui doit être d'un type de tranche, et renvoie la tranche résultante, également de type S.

Si la capacité de s n'est pas assez grande pour tenir compte des valeurs supplémentaires, append attribue une nouvelle tranche suffisamment grande qui correspond à la fois aux éléments de tranche existants et aux valeurs supplémentaires. Ainsi, la tranche renvoyée peut faire référence à un tableau sous-jacent différent.

Calls

Dans un appel de fonction, la valeur de fonction et les arguments sont évalués dans l'ordre habituel. Après leur évaluation, les paramètres de l'appel sont passés en valeur à la fonction et la fonction appelée commence exécution. Les paramètres de retour de la fonction sont transmis par la valeur à la fonction d'appel lorsque la fonction est rétablie.

Dans Go, les arguments sont passés par valeur.

Vous devez écrire res = append(res, functionx(i)) afin de ne pas ignorer la nouvelle valeur de res, qui fait référence à une tranche différente et, éventuellement, à un tableau sous-jacent différent.

Par exemple,

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) 
} 

Sortie:

[0 1] 
[0 1] 
[0 1 2]