是的,有可能。您有2(3)个选项:
规范:方法表达式该表达式
Foo.A产生的功能
A与第一个参数等效,但具有一个显式接收器。它有签名
func(f Foo)。
var f Foobar := func(m func(f Foo)) { m(f)}bar(Foo.A)bar(Foo.B)bar(Foo.C)
在这里,方法接收器是显式的。您只需将方法名称(具有它所属的类型)传递给
bar(),并且在调用它时,您必须传递实际的接收者:
m(f)。
预期的输出(在Go Playground上尝试):
规格:方法值ABC
如果
f是type的值
Foo,则表达式会
f.A产生
func()具有隐式接收者值的type的函数值
f。
var f Foobar := func(m func()) { m()}bar(f.A)bar(f.B)bar(f.C)
请注意,这里的方法接收器是隐含的,它被保存与传递给函数的值
bar(),所以它被称为没有明确指定它:
m()。
输出是相同的(在Go Playground上尝试)。
(出于完整性考虑:反射)不如以前的解决方案(在性能和“安全性”上都不错),但是您可以将方法的名称作为
string值传递,然后使用该
reflect包使用该名称来调用方法。它可能看起来像这样:
var f Foobar := func(name string) { reflect.ValueOf(f).MethodByName(name).Call(nil)}bar("A")bar("B")bar("C")
在Go Playground上尝试一下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)