golang – 传递方法来实现
我很好奇Go是否可行.我有一个多种方法的类型.有可能有一个函数,它接受一个方法,并可以调用它的类型?
这是我想要的一个小例子: package main import ( "fmt" ) type Foo int func (f Foo) A() { fmt.Println("A") } func (f Foo) B() { fmt.Println("B") } func (f Foo) C() { fmt.Println("C") } func main() { var f Foo bar := func(foo func()) { f.foo() } bar(A) bar(B) bar(C) } Go think类型Foo有一个名为foo()的方法,而不是用传入的方法名称替换它.
是的,这是可能的.你有2(3)个选择:
Spec: Method expressions 表达式Foo.A产生一个等效于A的函数,但显式接收器作为其第一个参数;它有签名函数(f Foo). var f Foo bar := func(m func(f Foo)) { m(f) } bar(Foo.A) bar(Foo.B) bar(Foo.C) 这里方法接收器是显式的.您只将方法名称(它所属的类型)传递给bar(),并且在调用它时,您必须传递实际的接收者:m(f). 按预期输出(在Go Playground上试试): A B C Spec: Method values 如果f是Foo类型的值,则表达式f.A产生具有隐式接收器值f的类型为func()的函数值. var f Foo bar := func(m func()) { m() } bar(f.A) bar(f.B) bar(f.C) 注意,这里方法接收器是隐式的,它与传递给bar()的函数值一起保存,因此在没有明确指定它的情况下调用它:m(). 输出相同(在Go Playground上试试). (完整性:reflection) 不如以前的解决方案(在性能和“安全性”方面),但您可以将方法的名称作为字符串值传递,然后使用 var f Foo bar := func(name string) { reflect.ValueOf(f).MethodByName(name).Call(nil) } bar("A") bar("B") bar("C") 请在Go Playground试试这个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |