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

Bil*_*ill 2 interface go

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

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)

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

Aru*_*ath 5

你可以做,

p := result.(*Bar)
*p = data
Run Code Online (Sandbox Code Playgroud)

第一行是类型断言.

第二个分配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'
}
Run Code Online (Sandbox Code Playgroud)

式开关switch语句