doutizha7526 2018-02-04 10: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 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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 ssh登录页面的问题
  • ¥60 渗透一个指定银行app,拿到客户信息,需要什么级别
  • ¥50 关于在matlab上对曲柄摇杆机构上一点的运动学仿真
  • ¥15 jetson nano
  • ¥15 :app:debugCompileClasspath'.
  • ¥15 windows c++内嵌qt出现数据转换问题。
  • ¥15 stm32 串口通讯过程中的问题
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问