如何将带有参数的函数句柄传递给Go中的另一个函数?

时间:2018-02-04 10:56:33

标签: go

我创建了一个scheduler()函数,它将在一个区间内执行传递的函数。

func scheduler(what func(), delay time.Duration) {
   fmt.Printf("Starting scheduled process on interval %d\n", delay)
   ticker := time.NewTicker(delay)
   quit := make(chan bool, 1)
   go func() {
      for {
         select {
           case <- ticker.C:
               what()
           case <- quit:
               ticker.Stop()
               return
         }
      }
   }()
   <-quit
}

安排以下ping功能可以很好地工作。

func ping() {
   fmt.Printf("Tick\n")
}

func main() {
   scheduler(ping, time.Second)
}

但是如果我改变ping以包含一个参数:

func ping(msg string) {
    fmt.Printf ("%s\n", msg)
} 
func main() {
  scheduler(ping("Hello"), time.Second)
}

我收到编译错误:

ping("Hi") used as value

如何使用参数传递此函数而不将其作为返回值传递?我想保持scheduler()函数足够通用,以便我可以使用具有不同参数签名的其他函数。

1 个答案:

答案 0 :(得分:4)

使用调用基础函数的匿名函数:

func main() {
    scheduler(func() {
        ping("Hello")
    }, time.Second)
}

这允许调用任意复杂的函数,甚至使用闭包:

db := // connect to a DB
scheduler(func() {
    ping(db, "Hello") // Or any other arbitrary complexity
}, time.Second)