Vi que el rango devuelve la clave y la "copia" del valor. ¿Hay alguna forma de que ese rango devuelva la dirección del artículo? Ejemplo
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for _, e := range array {
e.field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
http://play.golang.org/p/AFOGG9NGpx
Aquí "campo" no se modifica porque el rango envía la copia del campo. ¿Tengo que usar el índice o hay alguna otra forma de modificar el valor?
Gracias por leer.
MyType
?range
funciona bien y devuelve lo que ha puesto dentro del segmento. Aquí los valores de tipoMyStruct
(que es un tipo de valor) residen dentro del segmento. En su lugar, podríamos poner punteros de tipo*MyStruct
dentro del segmento. Si es absolutamente necesario que funcione como está, puede usar índices en lugar de valores devueltos porrange
.Respuestas:
La respuesta corta y directa: no, use el índice de la matriz en lugar del valor
Entonces el código anterior se convierte en:
package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for idx, _ := range array { array[idx].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
fuente
array[idx]
en su lugar podría optar por tenere := &array[idx]
en la parte superior del bucle y luego usare.field1
,e.field2
, etc, que se asemeja más a la OP hubiera querido (solo con dos líneas en lugar de uno)., _
completofor idx := range array
Ya se ha dicho en los comentarios, pero para aquellos que buscan respuestas de inmediato, así es como pueden lograr el resultado esperado usando una porción de punteros y haciendo los mínimos cambios en el código original.
package main import "fmt" type MyType struct { field string } func main() { // Slice of pointers instead of slice of type var array [10]*MyType // Initialize array manually for idx := range array { array[idx] = &MyType{} } for _, e := range array { e.field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
Aquí está en el patio de recreo
fuente
e := &array[idx]
dentro de cada rango que tenga ese puntero a un puntero ...package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for index := range array { array[index].field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } }
fuente