2012-05-24 36 views
9

He escrito el siguiente código. Pero no puedo tenerlo compilado. Aquí está mi código:Problemas sobre `slice` y` append` en 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 
} 

Mientras tanto, el mensaje de error es también muy confuso: prog.go:21: append(res, functionx(i)) not used

Pero si reemplazo append(res, functionx(i)) (línea 21) con res = append(res, functionx(i)), que funciona bastante bien. Alguien puede ayudarme?

¡Gracias!

Respuesta

30

Appending to and copying slices

El append función variadic anexa cero o más valores x a s de tipo S, que debe ser un tipo de segmento, y devuelve el rebanada resultante, también de tipo S.

Si la capacidad de s no es lo suficientemente grande para ajustarse a los valores adicionales, apéndice asigna una nueva porción lo suficientemente grande que se ajusta tanto a los elementos de corte existentes como a los valores adicionales. Por lo tanto, la división devuelta puede referirse a una matriz subyacente diferente.

Calls

En una llamada a la función, el valor de la función y los argumentos se evalúan en el orden habitual. Después de que se evalúan, los parámetros de la llamada se pasan por valor a la función y la función llamada comienza la ejecución . Los parámetros de retorno de la función pasan por el valor de regreso a la función de llamada cuando la función retorna.

En Go, los argumentos se pasan por valor.

Debe escribir res = append(res, functionx(i)) para no descartar el nuevo valor de res, que se refiere a un segmento diferente y, posiblemente, a un conjunto subyacente diferente.

Por ejemplo,

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

de salida:

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