2012-09-18 5 views
6

Ich habe folgenden Code:Wie beliebigen Wert einstellen Schnittstelle {}

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 
} 

I-Wert eines beliebigen Typs auf den Wert decode Funktion übergeben festlegen möchten. Ist es in Go möglich, oder ich missverstehe etwas?

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

+1

Go Pass-by-Wert . Wenn Sie einer lokalen Variablen etwas zuweisen, wirkt sich dies nie auf das Äußere aus. Sie können einen Referenztyp (wie einen Zeiger) verwenden, um das Objekt, auf das es zeigt, zu mutieren, um den Status zu teilen. aber dann würde es einen Zeiger des richtigen Typs benötigen, damit Sie etwas dem Ding zuweisen können, auf das es zeigt. – newacct

Antwort

5

generisch, nur 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

Das brauche ich, danke! –

1

Ich bin Ihr genauen Ziel nicht sicher.

Wenn Sie assert möchten, dass value ist ein Zeiger auf Point und ändern Sie es, können Sie das tun:

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

Sie können einen vorhandenen Punkt auch mit 'p: = value ändern. (* Point); * p = Punkt {20, 20} ' – newacct

+0

@newacct Hum ... du hast völlig Recht ... Ich habe meine Antwort gereinigt. Aber da ich immer noch nicht verstehe, was die eigentliche Absicht von OP ist, kann ich die ganze Antwort in ein paar Tagen entfernen. –

Verwandte Themen