登录
首页 >  Golang >  Go问答

将带有返回值的方法转换为接受 interface{} 参数的方法

来源:stackoverflow

时间:2024-03-06 23:54:25 258浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《将带有返回值的方法转换为接受 interface{} 参数的方法》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我有一个定义以下结构的插件:

type foo struct {
    counter int64
}

type plugin struct {}

func (p *plugin) do() *foo {
    // do something
    return &foo{123}
}

在我的主应用程序中,我需要将插件转换为接口,以便能够使用 do()。此时我不关心返回值(指向 foo 结构的指针),但如果有它就好了。

问题,如果我无权访问 foo 结构,如何转换和定义有效的接口?我尝试了以下选项:

type MyFoo struct {
    counter int64
}

type PluginInterface interface {
    Do() *MyFoo
}

type PluginInterface2 interface {
    Do() interface{}
}

func main() {
    plugin := Plugin{} // this would be code that loads bar as an interface {} from the plugin
    do(&plugin)

}

func do(plugin interface{}) {
    _, ok := plugin.(PluginInterface)
    fmt.Println("OK with own Struct?", ok) // false
    _, ok2 := plugin.(PluginInterface2)
    fmt.Println("OK with generic interface?", ok2) // false
}

但是,到 plugininterfaceplugininterface2 的转换失败。显然,如果我更改插件中 do() 的方法定义以返回通用 interface{},则 plugininterface2 转换将会成功。

示例代码:https://play.golang.org/p/rb5zzvchspc


解决方案


你不能。更改 plugin.do() 的签名以返回插件外部定义的类型值(例如,在您的应用程序和插件使用的第三个包中定义),或者返回例如interface{}

查看相关问题:

如果无法更改插件,可以使用反射来调用该方法。调用Time.Hour()方法的示例:

var x interface{} = time.date(2019, 1, 1, 14, 0, 0, 0, time.utc)

v := reflect.valueof(x)
hour := v.methodbyname("hour")
results := hour.call(nil)
fmt.println(results[0])

它输出(在 Go Playground 上尝试):

14

理论要掌握,实操不能落!以上关于《将带有返回值的方法转换为接受 interface{} 参数的方法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>