如何设置接口{}的任何值

时间:2012-09-18 14:14:12

标签: go

我有以下代码:

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

2 个答案:

答案 0 :(得分:5)

通常只有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)
}

答案 1 :(得分:1)

我不确定你的确切目标。

如果您希望assert valuePoint的指针并进行更改,则可以执行此操作:

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