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

标签 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() 函数足够通用,以便我可以使用具有不同参数签名的其他函数。

最佳答案

使用调用底层函数的匿名函数:

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)

关于go - 如何将带参数的函数句柄传递给 Go 中的另一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48607328/

相关文章:

go - 运行时错误 : invalid memory address or nil pointer dereference in martini with template

go - golang 中的模板未被渲染

go - 在 Golang 中,如何使用 channel 处理多个 goroutine

assembly - 为什么汇编 POPCNTQ 基准测试会比使用整数技巧的 native Go 函数慢?

go - 如何为 go get 指定安装依赖项

go - 如何解决 `catch` 特定错误

go - 在客户端中获取 405 http 错误以调用 gRPC Web

go - Golang 中有等效的 Guava 表吗?如果不是,在 Go 中正确的做法是什么

当未使用的函数被注释掉时,Go运行时错误

string - 如何将整个文件读入字符串变量