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

如何将带有参数的函数句柄传递给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 03: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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部