我正在Go for Go中编写一个解析器,为了测试它,我从github项目下载了一系列文件

func moveLabel(*Button) {
    from := movingCurrent
    to := 0
    if from == 0 {
        to = 1
    }
    movingBoxes[from].Delete(0)
    movingBoxes[to].Append(movingLabel, false)
    movingCurrent = to
}

It confuse me a bit to see a pointer to a Button without a name as a function argument, which makes it impossible to reference from inside the function.
However, it seems to be syntactically correct given that the compiler doesn't complains.
What is the purpose of unamed functions arguments in Go?

推荐答案

未命名的参数完全有效.规格中的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

Go相关问答推荐

如何将泛型函数作为参数传递给golang中的另一个函数?

编辑时保留YAML文件中的单引号

如何使用Gorilla WebSockets实现Http.Hijacker&;alexedwards/scs/v2

如何在gofr发起的服务间调用请求中添加Authorization Header?

戈姆:如何将一对一联系起来?

Go 1.20 中如何计算连接错误?

Go 中将 int 切片转换为自定义 int 切片指针类型的函数

Go Template 动态获取变量

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

当客户端同时是服务器时,需要什么 mTLS 证书?

golang:解组动态 YAML 注释

为什么不同的 Wireguard 私钥会产生相同的公钥?

整理时转换值

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

go-libp2p - 从流中接收字节

如何在golang中按字符a对字符串数组进行排序

每次有人进入我的网站时如何运行特定功能?

在 Golang 中获取谷歌云服务帐户的访问令牌?

Terraform 自定义提供程序 - 数据源架构

测试包外文件时的 Golang 测试覆盖率