未命名的参数完全有效.规格中的Parameter declaration个:
ParameterDecl = [ IdentifierList ] [ "..." ] Type .
如您所见,IdentifierList
(一个或多个标识符名称)在方括号中,这意味着它是optional.只需要Type
分.
这是因为名字对调用方法或函数的人来说并不重要.重要的是参数的类型及其顺序.答案中详细说明了这一点:Getting method parameter names in Golang
通常,您可以命名变量和参数,以便引用它们.
当你不给某事命名时,那是因为你不想提及它.
所以问题应该是:Why would I not want to refer to a parameter?
例如,因为参数"is there"(它已传递),但是您不需要它,所以您不想使用它.如果我不需要它为什么会在那里?
因为某个人或某个东西需要dictates个特定参数才会出现.例如,您希望实现一个接口,或者您希望传递一个函数值,该函数值的签名由预期的函数类型定义.
让我们来看一个例子.我们有以下MyWriter
接口:
type MyWriter interface {
Write(p []byte) error
}
简化的io.Writer
,它只返回错误,但不报告写入的字节数.如果您想要提供一个只丢弃数据的实现(类似于ioutil.Discard
),则该实现不使用(不需要使用)其参数:
type DiscardWriter struct{}
func (DiscardWriter) Write([]byte) error { return nil }
仅此而已:我们不使用接收器,我们不使用参数.这两个都可以是无名的.而实现恰好做了它应该做的事情.
这样做(使用未命名的参数)也是documents,不使用/引用该值.
另一个原因可以是提供forward兼容性.如果您发布一个库,您无法在不 destruct 向后兼容性的情况下更改或扩展参数列表(而且在Go中没有函数重载:如果您想要2个具有不同参数的变体,则它们的名称也必须不同).因此,您可以在早期使用附加参数声明导出的函数或方法,但是由于您还没有使用它们,所以可以将它们保留为未命名.这方面的一个例子在下面的答案中有详细说明:Why does Go allow compilation of unused function parameters?
这里需要注意的一点是,不能混合使用命名参数和未命名参数.如果你说出一些,你必须说出所有.如果您不需要全部,可以使用blank identifier,如本例所示:
一个简单的Web服务器,它用"Hello"
个文本响应所有请求:
http.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) {
io.WriteString(w, "Hello")
})
panic(http.ListenAndServe(":8080", nil))
发回"Hello"
文本的处理程序函数仅使用响应编写器w
,而不使用请求 struct ,因此使用空白标识符作为其名称.
另一个相关问题是:
Why must we declare a variable name when adding a method to a struct in Golang?
也有些关联,但关于使用/命名返回值:
Return map like 'ok' in Golang on normal functions
关于获取方法/函数参数名称:
Getting method parameter names in Golang