【问题标题】:How to pass parameters to decorated functions?如何将参数传递给装饰函数?
【发布时间】:2021-08-06 02:12:10
【问题描述】:

我想写一个装饰器来包装一个带有“之前”和“之后”命令的函数。下面是第一个版本,装饰函数只输出hello

package main

import "fmt"

func main() {
    wrapper(printHello, "world")
}

func wrapper(f func(), who string) {
    fmt.Printf("before function, sending %v\n", who)
    f()
    fmt.Print("after function\n")
}

func printHello() {
    fmt.Printf("hello\n")
}

(游乐场:https://play.golang.org/p/vJuQKWpZ2h9

我现在想用一个参数调用修饰函数(在我的例子中是"world")。在上面的示例中,它已成功传递给wrapper(),但我不知道该怎么做。我以为我会

package main

import "fmt"

func main() {
    wrapper(printHello, "world") // cannot use printHello as the type func()
}

func wrapper(f func(), who string) {
    fmt.Printf("before function, sending %v\n", who)
    f(who) // too many arguments
    fmt.Print("after function\n")
}

func printHello(who string) {
    fmt.Printf("hello %v\n", who)
}

编译失败

.\scratch_11.go:6:9: cannot use printHello (type func(string)) as type func() in argument to wrapper
.\scratch_11.go:11:3: too many arguments in call to f
    have (string)
    want ()

将参数传递给修饰函数的正确方法是什么?

【问题讨论】:

  • 声明正确的类型:func wrapper(f func(string), who string)
  • @BurakSerdar:是的,现在这很明显。非常感谢。如果您不介意将评论变成答案,我很乐意投票并接受它。

标签: go parameters decorator


【解决方案1】:

您必须声明正确的变量类型才能使其工作:

func wrapper(f func(string), who string) {
...

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 2021-11-21
    • 1970-01-01
    • 2020-12-18
    • 2010-12-30
    • 2014-11-17
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多