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 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘