doutizha7526
2018-02-04 10:56
浏览 70
已采纳

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

I created a scheduler() function which will execute a passed function on an interval.

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

Scheduling the following ping function works perfectly.

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

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

However if I change ping to include an argument as so:

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

I get the compile error:

ping("Hi") used as value

How do I pass this function with arguments without passing it as the return value? I would like to keep the scheduler() function generic enough that I can use other functions that have different argument signatures.

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • duanhaodi4809 2018-02-04 11:08
    已采纳

    Use an anonymous function which calls your underlying function:

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

    This allows calling arbitrarily complex functions, or even using closures:

    db := // connect to a DB
    scheduler(func() {
        ping(db, "Hello") // Or any other arbitrary complexity
    }, time.Second)
    
    已采纳该答案
    打赏 评论

相关推荐 更多相似问题