我有一个看起来像这样的函数:
func Foo(result interface{}) error {
...
json.Unmarshal([]byte(some_string), result)
...
}
这就是这样称呼的:
var bar Bar
Foo(&bar)
通常,Foo会获取一个字符串,然后将其编组到结果中。但是,现在我需要更新它,以便Foo有时从另一个源加载数据并返回它。
type Loader func() (interface{})
func Foo(result interface{}, Loader load) error {
...
data := load()
// result = data ???
...
}
我有什么方法可以将这个新值分配给结果吗?我发现我可以将数据编组成一个字符串然后将其解组成有效的结果,但我无法想象这是最好的方法。
答案 0 :(得分:5)
你可以,
p := result.(*Bar)
*p = data
第一行是type assertion。
第二个将data
分配给解除引用的指针。为解除引用的指针赋值会更改引用地址的值。
由于您不了解result
或data
的基础类型,您可以做的最好的事情就是使用类型断言开关。
switch v := data.(type) {
case Bar:
// If 'data' is of type 'Bar'
p, ok := result.(*Bar)
if(!ok){
// This means inputs were bad.
// 'result' and 'data' should both have the same underlying type.
fmt.Println("underlying types mismatch")
break;
}
*p = v
case Baz:
// If 'data' is of type 'Baz'
// Equivalent of above for 'Baz'
}
中的类型开关