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?rangefunciona 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*MyStructdentro 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 arrayYa 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