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

标签 go

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

例如:不能传递如下函数:

func Foo (b *Bar) {}

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

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

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

最佳答案

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

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

关于go - 将带参数的函数传递给 time.AfterFunc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49626229/

相关文章:

go - 在这里使用准备好的语句会更好吗?

matrix - 使用biogo计算矩阵逆?

go - 紧密环路泄漏 Reader

go - 为什么结构的字段是 "non-name"

带有 Channels 的 Golang 内存引用

go - 从 Go 中的 channel 读取多个元素

concurrency - 没有看到 goroutines 的预期副作用

go - 如何在 *os.File/io.Read 中设置超时

go - 如何在 Go 中递归列出带有 channel 的文件?

go - 如何在Go-lang中发送没有URL编码的查询值?