Go 为什么我可以省略函数的参数名?

Go 为什么我可以省略函数的参数名?,go,Go,我无意中编写了类似这样的代码(简化为一个最小的示例): 我认为应该是: func f(args ...interface{}) int { return 4 } 为什么go编译器允许没有参数名的版本,这意味着什么?例如,如果您想要满足某个接口,但不访问有问题的参数,您可以使用匿名函数参数 给定 这与您的代码几乎相同:您声明了一个函数参数,但没有使用它。正如Volker提到的,这是语言规范允许的,我理解您对它的用途的混淆 如果不命名参数,则无法访问其值。但在极少数情况下,你实际上不需要这

我无意中编写了类似这样的代码(简化为一个最小的示例):

我认为应该是:

func f(args ...interface{}) int {
    return 4
}

为什么go编译器允许没有参数名的版本,这意味着什么?

例如,如果您想要满足某个接口,但不访问有问题的参数,您可以使用匿名函数参数

给定


这与您的代码几乎相同:您声明了一个函数参数,但没有使用它。

正如Volker提到的,这是语言规范允许的,我理解您对它的用途的混淆

如果不命名参数,则无法访问其值。但在极少数情况下,你实际上不需要这样做。如果您有一个要实现的接口,该接口声明了参数,但您的实现不需要这些参数,则无需命名它们,例如,在编写模拟时:

类型Foo接口{
条(线)
}
类型MockFoo struct{}
func(MockFoo)条(字符串){
//无所事事
}

语言规范允许这样做。但为什么,这意味着什么?这意味着您忽略了输入变量。你就是。嗨,亚历克斯,我对你的问题做了大量编辑。网站上的读者可以更清楚地看到一个简单的例子,在没有无关内容的情况下演示这个问题。我想(希望)我保留了你问题的精神。为了完整起见:你也可以省略接收人的名字<代码>函数(一般问候者)问候(字符串)字符串{
func f(args ...interface{}) int {
    return 4
}
package main

import "fmt"


type Greeter interface {
    // Note that the Greet function requires a parameter
    Greet(string) string
}

// GenericGreeter is the most basic Greeter.
type WorldGreeter struct {
}

// Greet satisfies the Greeter interface, which requires a string parameter for
// the Greet function.
func (g GenericGreeter) Greet(string) string {
    // Now, here is the thing: We do not access
    // the parameter, hence it can be anonymous.
    return "Hello, World!"
}

func PrintGreeting(g Greeter) {
    fmt.Println(g.Greet(""))
}

func main() {
    PrintGreeting(&GenericGreeter{})
}