6

我有以下代码:

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
}

我想将任何类型的值设置为传递给decode函数的值。Go中是否有可能,或者我误解了什么?

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

4

2 回答 2

5

通常,仅使用反射

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)
}
于 2012-09-18T14:26:44.190 回答
1

我不确定你的确切目标。

如果你想断言value是一个指针Point并改变它,你可以这样做:

func decode(value interface{}) {
    p := value.(*Point)
    p.x=10
    p.y=10
}
于 2012-09-18T14:17:26.420 回答