2012-09-18 13 views
6

He siguiente código:Cómo establecer cualquier valor a la interfaz {}

package main 

import (
    "fmt" 
) 

type Point struct { 
    x,y int 
} 

func decode(value interface{}) { 
    fmt.Println(value) // -> &{0,0} 

    // This is simplified example, instead of value of Point type, there 
    // can be value of any type. 
    value = &Point{10,10} 
} 

func main() { 
    var p = new(Point) 
    decode(p) 

    fmt.Printf("x=%d, y=%d", p.x, p.y) // -> x=0, y=0, expected x=10, y=10 
} 

quiero fijar valor de cualquier tipo con el valor pasado a decode función. ¿Es posible en Go, o malinterpreto algo?

http://play.golang.org/p/AjZHW54vEa

+1

Go es el paso por valor . Asignar algo a una variable local nunca afecta al exterior. Puede usar un tipo de referencia (como un puntero) para mutar lo que apunta a fin de compartir el estado; pero luego necesitaría un puntero del tipo correcto para que pueda asignarle algo a lo que apunta. – newacct

Respuesta

5

Genéricamente, solamente using reflection:

package main 

import (
    "fmt" 
    "reflect" 
) 

type Point struct { 
    x, y int 
} 

func decode(value interface{}) { 
    v := reflect.ValueOf(value) 
    for v.Kind() == reflect.Ptr { 
     v = v.Elem() 
    } 
    n := reflect.ValueOf(Point{10, 10}) 
    v.Set(n) 
} 

func main() { 
    var p = new(Point) 
    decode(p) 
    fmt.Printf("x=%d, y=%d", p.x, p.y) 
} 
+0

Eso es lo que necesito, ¡gracias! –

1

no estoy seguro de su objetivo exacto.

Si desea assert que value es un puntero a Point y cambiarlo, puede hacerlo:

func decode(value interface{}) { 
    p := value.(*Point) 
    p.x=10 
    p.y=10 
} 
+1

también puede cambiar un punto existente con 'p: = value. (* Point); * p = Punto {20, 20} ' – newacct

+0

@newacct Hum ... tienes toda la razón ... Limpié mi respuesta. Pero como aún no entiendo cuál fue el verdadero propósito de OP, puedo eliminar la respuesta completa en unos días. –

Cuestiones relacionadas