我有一个看起来像这样的函数:
func Foo(result interface{}) error {
...
json.Unmarshal([]byte(some_string), result)
...
}
Run Code Online (Sandbox Code Playgroud)
这被称为:
var bar Bar
Foo(&bar)
Run Code Online (Sandbox Code Playgroud)
通常,Foo获取一个字符串,然后将其编组到结果中.但是,现在我需要更新它,以便Foo有时从另一个源加载数据并返回它.
type Loader func() (interface{})
func Foo(result interface{}, Loader load) error {
...
data := load()
// result = data ???
...
}
Run Code Online (Sandbox Code Playgroud)
我有什么方法可以将这个新值分配给结果吗?我发现我可以将数据编组成一个字符串,然后将其解组成结果,但是我无法想象这是最好的方法.
你可以做,
p := result.(*Bar)
*p = data
Run Code Online (Sandbox Code Playgroud)
第一行是类型断言.
第二个分配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'
}
Run Code Online (Sandbox Code Playgroud)
见式开关从switch语句