【问题标题】:Function defines unnamed parameters but caller still passes values函数定义了未命名的参数,但调用者仍然传递值
【发布时间】:2020-05-13 09:20:35
【问题描述】:

我正在尝试理解 Golang 中的 Wire 库,发现在 wire.go 中有一个函数如下所示:

func NewSet(...interface{}) ProviderSet {
    return ProviderSet{}
}

为什么...interface{}) 参数未命名(意味着未在函数内部使用)但调用者仍将 有意义 值传递给它,这对我来说似乎很陌生?

var Set = wire.NewSet(
    wire.Value(Foo(41)),
    provideFooBar)

【问题讨论】:

    标签: go dependency-injection


    【解决方案1】:

    参数被命名或未命名与调用者是否必须为它们传递值无关。未命名只是意味着它们不能在函数内部使用(不能被引用)。

    NewSet 有一个可变参数,这意味着可以将任意数量的参数传递给它可以分配给该类型,并且可以将任何值分配给interface{}(所有值都实现了空接口)。

    您看到的NewSet() 的“空”实现只是文档和编译器的占位符。生成的代码将使用传递的参数。

    如果你有一个函数:

    func dummy(int) {}
    

    你不能像dummy() 这样称呼它,这是一个编译时错误。您只能通过将 int 值传递给它来调用它,例如dummy(1).

    查看相关:Is unnamed arguments a thing in Go?

    【讨论】:

    • 我可以看到调用者确实为这些参数提供了有意义的值,而不仅仅是转储值以满足签名。这是为什么呢?
    • @petwho 您看到的NewSet() 的“空”实现只是文档和编译器的占位符。生成的代码将使用传递的参数。
    • 我会接受您的回答,您能否将此评论添加到您的回答中,以便阅读它的其他人也可以拥有此信息而无需阅读评论?
    猜你喜欢
    • 2011-08-29
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2022-01-04
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多