如何将接口{}作为特定结构传递给函数?

时间:2015-06-02 20:19:36

标签: go

我正在尝试在特定组件之间使用通用例程处理消息。部分内容涉及读取字节数组并使用json.Marshal和json.Unmarshal并调用回调。

我试图将接口传递给期望特定结构的函数,但我不知道目标结构的类型。在下面的代码中,函数r()如何调用函数cb()并传入正确的数据?

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

type Bottom struct {
    Foo string
}

func cb(b *Bottom) {

    fmt.Println("5. ", b)
}

func r(t interface{}, buf []byte) {

    _ = json.Unmarshal(buf, &t)

    fmt.Println("2. ", reflect.TypeOf(t))
    fmt.Println("3. ", t)

    cb(&t)
}

func main() {
    x := Bottom{Foo: "blah"}
    var y Bottom

    buf, _ := json.Marshal(x)

    fmt.Println("1. ", x)
    r(&y, buf)
}

1 个答案:

答案 0 :(得分:2)

您需要use a type assertioninterface{}转换为您的功能所需的类型。然后,您可以添加错误检查以适当地处理您的参数无法类型转换为所需类型的情况。

请参阅此演示解决方案的通用游乐场:http://play.golang.org/p/NYeoAVTEeA

在您的情况下,这意味着

cb(&t.(Bottom))

您可以添加错误检查:

bottom, ok := t.(Bottom)
if !ok {
  // do something
}
cb(&bottom)