【问题标题】:Passing a function with parameters to time.AfterFunc将带参数的函数传递给 time.AfterFunc
【发布时间】:2018-04-03 09:09:50
【问题描述】:

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

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

func Foo (b *Bar) {}

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

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

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

【问题讨论】:

  • 不,这里可以关闭。
  • 由于您不能将附加参数传递给time.AfterFunc(),如果函数需要任何附加参数的值,它将如何“猜测”?除了传递闭包,您还可以批量处理方法值(example1example2)。
  • 一个很好的解释,你为什么不添加它作为答案?。这是我想知道的。
  • 为什么投反对票?我刚开始学习 Go,发现这个问题很有帮助。
  • 同样的问题。为什么投反对票?我认为 stackoverflow 应该要求投票者解释并揭示他们的身份。这很烦人。

标签: go


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    匿名函数可帮助您将带参数的函数发送到 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

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 2016-06-29
      • 2019-03-29
      • 1970-01-01
      • 2013-01-27
      • 2014-01-06
      • 2015-08-29
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多