插件包中 Lookup 返回什么?
What is returned by Lookup in plugin package?
这是一个代码块。
p, err := plugin.Open(filename)
if err != nil {
log.Fatalf("cannot load plugin %v", filename)
}
xmapf, err := p.Lookup("Map")
if err != nil {
log.Fatalf("cannot find Map in %v", filename)
}
mapf := xmapf.(func(string, string) []mr.KeyValue)
我知道这段代码是加载一个插件并在其中找到一个Map
函数。但是我对xmapf.(func(string, string) []mr.KeyValue)
感到困惑。 xmapf
的类型是什么? golang文档说是Symbol
,Symbol是指向变量或函数的指针。如果我对 xmapf
的类型是正确的,为什么 func_pointer.(signature)
returns 是一个函数?
Plugin.Lookup()
returns a plugin.Symbol
这只是一个空 interface{}
值:
type Symbol interface{}
Go 中(还)没有泛型,所以这是必需的,因此您可以使用单个查找函数来查找任何类型的变量和函数。
并且您需要在返回的符号上使用 type assertion 以从中获取具体(或其他接口)类型的值。
xmapf.(func(string, string) []mr.KeyValue)
这是一个类型断言,如果它成立(如果xmapf
不是nil
并且它持有具体类型func(string, string) []mr.KeyValue
的值),则类型断言的结果将是该类型的值。 “那个”类型是一个函数类型,所以如果类型断言成立,mapf
将持有一个函数值,你可以“直接”调用它,比如
var keyValues []mr.KeyValue
keyValues = mapf("a", "b")
这是一个代码块。
p, err := plugin.Open(filename)
if err != nil {
log.Fatalf("cannot load plugin %v", filename)
}
xmapf, err := p.Lookup("Map")
if err != nil {
log.Fatalf("cannot find Map in %v", filename)
}
mapf := xmapf.(func(string, string) []mr.KeyValue)
我知道这段代码是加载一个插件并在其中找到一个Map
函数。但是我对xmapf.(func(string, string) []mr.KeyValue)
感到困惑。 xmapf
的类型是什么? golang文档说是Symbol
,Symbol是指向变量或函数的指针。如果我对 xmapf
的类型是正确的,为什么 func_pointer.(signature)
returns 是一个函数?
Plugin.Lookup()
returns a plugin.Symbol
这只是一个空 interface{}
值:
type Symbol interface{}
Go 中(还)没有泛型,所以这是必需的,因此您可以使用单个查找函数来查找任何类型的变量和函数。
并且您需要在返回的符号上使用 type assertion 以从中获取具体(或其他接口)类型的值。
xmapf.(func(string, string) []mr.KeyValue)
这是一个类型断言,如果它成立(如果xmapf
不是nil
并且它持有具体类型func(string, string) []mr.KeyValue
的值),则类型断言的结果将是该类型的值。 “那个”类型是一个函数类型,所以如果类型断言成立,mapf
将持有一个函数值,你可以“直接”调用它,比如
var keyValues []mr.KeyValue
keyValues = mapf("a", "b")