Go插件Lookup返回值类型及类型断言技术问询
解惑Go插件中的
plugin.Symbol与类型断言 嘿,这个问题其实核心在于理解plugin.Symbol的本质,我来给你掰扯清楚:
首先说xmapf的类型:
- 你从
p.Lookup("Map")拿到的xmapf确实是plugin.Symbol类型,但你去翻Go的源码会发现,这个类型的定义其实就是type Symbol interface{}——没错,就是个空接口!官方文档说它是“指向变量或函数的指针”,其实是一种语义上的描述,因为它承载的是插件里导出的任意符号(可以是变量,也可以是函数),空接口刚好能装下任何类型的值,所以用它来做统一的返回类型。
然后解释为什么类型断言能拿到函数:
- 当你在插件里导出了
Map这个函数,并且知道它的签名是func(string, string) []mr.KeyValue,那Lookup返回的xmapf这个空接口内部,实际存储的就是这个函数的值。 - 那行类型断言
xmapf.(func(string, string) []mr.KeyValue),本质就是在告诉Go:“我百分百确定这个空接口里装的是这个签名的函数,帮我把它转成这个类型,我要直接用”。如果插件里的Map真的是这个类型,断言就成功,你得到的mapf就是可以直接调用的函数;要是类型不匹配(比如插件里的Map是个变量或者其他签名的函数),程序就会panic。
再结合你的代码拆解流程:
xmapf, err := p.Lookup("Map") if err != nil { log.Fatalf("cannot find Map in %v", filename) } mapf := xmapf.(func(string, string) []mr.KeyValue)
- 第一步通过
Lookup从插件中找到名为Map的符号,它被包裹在plugin.Symbol(也就是空接口)里返回; - 第二步用类型断言把这个空接口“拆包”成你需要的具体函数类型,之后你就可以像调用普通Go函数一样使用
mapf了。
内容的提问来源于stack exchange,提问作者Yaokun Xu
相关产品推荐
相关产品推荐

