Go:通过接口{}指针传递返回值

时间:2016-04-06 09:17:19

标签: go interface

我有一个看起来像这样的函数:

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 ???
     ...
}

我有什么方法可以将这个新值分配给结果吗?我发现我可以将数据编组成一个字符串然后将其解组成有效的结果,但我无法想象这是最好的方法。

1 个答案:

答案 0 :(得分:5)

你可以,

p := result.(*Bar)
*p = data

第一行是type assertion

第二个将data分配给解除引用的指针。为解除引用的指针赋值会更改引用地址的值。

由于您不了解resultdata的基础类型,您可以做的最好的事情就是使用类型断言开关。

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'
}

请参阅switch statement

中的类型开关