我创建了一个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()
函数足够通用,以便我可以使用具有不同参数签名的其他函数。
答案 0 :(得分:4)
使用调用基础函数的匿名函数:
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)