将带参数的函数传递给time.AfterFunc

时间:2018-04-03 09:09:51

标签: go

time.AfterFunc()接受持续时间和函数在该持续时间到期时执行。但该函数不能是接受参数的函数。

例如:无法传递以下函数:

func Foo (b *Bar) {}

虽然,可以初始化一个调用上面的函数然后传递它的新函数:

f := func() {
    Foo(somebar)
}
timer := time.AfterFunc(1*time.Second, f)

这真的应该这样吗?
为什么time.AfterFunc不接受任何接受参数的函数?
是否存在其他/更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

从参数创建一个函数,返回它。

package main

import (
    "fmt"
    "time"
)

func foo(bar string) {
    fmt.Printf("in foo('%s')\n", bar)
}

func newFunc(bar string) func() {
    fmt.Printf("creating func with '%s'\n", bar)
    return func() {
        foo(bar)
    }
}

func main() {
    somebar := "Here we go!"
    f := newFunc(somebar)
    _ = time.AfterFunc(1*time.Second, f)

    time.Sleep(2 * time.Second)
}

https://play.golang.com/p/lWgeHvPLg9N

答案 1 :(得分:0)

匿名函数可帮助您将带有参数的函数发送到AfterFunc。

package main

import (
    "fmt"
    "time"
)

func foo(bar string) {

    fmt.Printf("in foo('%s')\n", bar)
}

func main() {
    somebar := "Here we go!"
    time.AfterFunc(1*time.Second, func(){foo(somebar)})
    time.Sleep(2 * time.Second)
}

https://play.golang.com/p/sdpiBtBWt_s