El rango de referencia en lugar de los valores de

Vi que range devuelve la clave y la «copia» del valor. Hay una manera de que van a devolver la dirección del elemento? 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 de campo,
¿Tengo que usar el índice o hay alguna otra manera de modificar el valor?

Gracias por leer.

  • posibles duplicados de Cambio de valores, mientras que la iteración en golang
  • Se puede utilizar una matriz de puntero de MyType?
  • Sí, si usted utiliza una matriz de punteros que pueden modificar los resultados directamente en la matriz sin tener que usar el índice, hay un ejemplo aquí play.golang.org/p/_Vx7ONLDJs
  • range está trabajando bien & devuelve lo que has puesto en el interior del segmento. Aquí los valores de tipo MyStruct (que es un tipo de valor) residen en el interior del segmento. En su lugar se podría poner punteros de tipo *MyStruct en el interior del segmento. Si es absolutamente necesario que funcione de la manera que es, usted podría utilizar índices en lugar de los valores devueltos por range.
InformationsquelleAutor Epitouille | 2013-11-25

1 Kommentar

  1. 90

    El corto & respuesta directa: no, usar el índice de la matriz en lugar del valor

    Por lo que 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("--")
        }
    }
    • Y por supuesto, si usted repetidamente el acceso array[idx] usted puede optar por tener e := &array[idx] en la parte superior del bucle y, a continuación, utilizar e.field1, e.field2, etc que más se asemeja a la OP hubiera querido (sólo con dos líneas en lugar de uno).
    • Puedes colocar el , _ totalmente for idx := range array

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea