为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中将函数存储在切片中

如何在 Go 中将函数存储在切片中

Go
青春有我 2021-12-20 10:02:54
我正在尝试将以下 Python 功能移植到 Golang。特别是如何将函数存储在切片中然后调用它们。我怎样才能在 Golang 中做到这一点?class Dispatcher(object):    def __init__(self):        self._listeners = []    def addlistener(self, listener):        self._listeners.append(listener)    def notifyupdate(self):        for f in self._listeners:            f()def beeper():    print "beep...beep...beep"def pinger():    print "ping...ping...ping"dispatch = Dispatcher()dispatch.addlistener(beeper)dispatch.addlistener(pinger)dispatch.notifyupdate()output:beep...beep...beepping...ping...ping
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

其实很简单:


package main


import "fmt"


func main() {

    var fns []func()

    fns = append(fns, beeper)

    fns = append(fns, pinger)


    for _, fn := range fns {

        fn()

    }

}


func beeper() {

    fmt.Println("beep-beep")

}


func pinger() {

    fmt.Println("ping-ping")

}

游乐场:http : //play.golang.org/p/xuDsdeRQX3。


查看完整回答
反对 回复 2021-12-20
?
九州编程

TA贡献1785条经验 获得超4个赞

或者,如果您想要一个更紧密的结构(诚然,在这种情况下根本不需要):


package main


import "fmt"


type dispatcher struct {

    listeners []func()

}


func (d *dispatcher) addListener(f func()) {

    d.listeners = append(d.listeners, f)

}


func (d *dispatcher) notify() {

    for _, f := range d.listeners {

        f()

    }

}


func ping() {

    fmt.Println("Ping... ping...")

}


func beep() {

    fmt.Println("Beep... beep...")

}


func main() {

    d := dispatcher{}

    d.addListener(ping)

    d.addListener(beep)

    d.notify()

}


查看完整回答
反对 回复 2021-12-20
?
慕村9548890

TA贡献1884条经验 获得超4个赞

如果您使用更复杂的功能,请执行以下操作:


func addr(instru, beforeg [4]int) [4]int {

    beforeg[instru[3]] = beforeg[instru[1]] + beforeg[instru[2]]

    return beforeg

}


func addi(instru, beforeg [4]int) [4]int {

    beforeg[instru[3]] = beforeg[instru[1]] + instru[2]

    return beforeg

}


func day16Run(isTest bool) {

    arrayFunc:= [16]func([4]int, [4]int) [4]int{addr, addi}

    // use arrayFunc

}

如果您的函数具有不同的签名,请随时使用切片并附加,但在调用函数时要小心


查看完整回答
反对 回复 2021-12-20
  • 3 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信