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

Go 如何将接口{}作为特定结构传递给函数?,go,Go,我正在尝试使用一个通用例程来处理特定组件之间的消息。其中一部分涉及读取字节数组,使用json.Marshal和json.Unmarshal并调用回调 我试图将接口传递给需要特定结构的函数,但我不知道目标结构的类型。在下面的代码中,函数r()如何调用函数cb()并传入正确的数据 package main import ( "encoding/json" "fmt" "reflect" ) type Bottom struct { Foo string } fu

我正在尝试使用一个通用例程来处理特定组件之间的消息。其中一部分涉及读取字节数组,使用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)
}
您需要将
接口{}
转换为函数所需的类型。然后,您可以添加错误检查,以适当处理无法将参数类型转换为所需类型的情况

请参阅此演示解决方案的通用平台:

对你来说,这意味着

cb(&t.(Bottom))
您可以添加错误检查:

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

例如,在函数r()中,如果我将行改为cb(t.(*Bottom)),代码就会工作。但是在函数r()中,我不想知道任何特定类型。如果
cb()
需要
Bottom
,那么所有调用方都需要知道
Bottom
类型。如果您的调用者不知道
Bottom
类型,那么您的
cb()
函数应该接受
Bottom
实现的接口,而不是
Bottom
类型的结构。我希望这样做,使我的函数r()不知道Bottom。在这种情况下,您需要定义一个
r()的接口
确实知道
Bottom
实现,并让
cb
获取该接口的实例,而不是
Bottom
类型的参数。