加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang – 传递方法来实现

发布时间:2020-12-16 19:21:09 所属栏目:大数据 来源:网络整理
导读:我很好奇Go是否可行.我有一个多种方法的类型.有可能有一个函数,它接受一个方法,并可以调用它的类型? 这是我想要的一个小例子: package mainimport ( "fmt")type Foo intfunc (f Foo) A() { fmt.Println("A")}func (f Foo) B() { fmt.Println("B")}func (f
我很好奇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)

不如以前的解决方案(在性能和“安全性”方面),但您可以将方法的名称作为字符串值传递,然后使用reflect包以该名称调用方法.它可能看起来像这样:

var f Foo
bar := func(name string) {
    reflect.ValueOf(f).MethodByName(name).Call(nil)
}
bar("A")
bar("B")
bar("C")

请在Go Playground试试这个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读