奇怪的方法输出

Fua*_*nov 0 methods go

我对简单程序的输出感到困惑。我希望在输出中获得所有四个名称,但无法在输出中获得第一个名称。请帮我清除这个问题,或者一些相关的资源。

type Employees struct {
    Name string
}

func main() {
    chandran := Employees{Name: "Chandran"}
    darpan := Employees{Name: "Darpan"}
    ishaan := Employees{Name: "Ishaan"}
    manbir := Employees{Name: "Manbir"}

    Employees.structName(chandran, darpan, ishaan, manbir)
}

func (e Employees) structName(names ...Employees){
    fmt.Println(names)
}
Run Code Online (Sandbox Code Playgroud)

go Playground 中的代码

icz*_*cza 5

Go 中没有“静态”方法。要调用方法,您必须具有接收器类型的值,并对该值调用该方法。

所以你必须这样称呼它:

var e Employees
e.structName(chandran, darpan, ishaan, manbir)
Run Code Online (Sandbox Code Playgroud)

或者简单地:

Employees{}.structName(chandran, darpan, ishaan, manbir)
Run Code Online (Sandbox Code Playgroud)

这两个输出(在Go Playground上尝试):

[{Chandran} {Darpan} {Ishaan} {Manbir}]
Run Code Online (Sandbox Code Playgroud)

为什么你的版本省略了第一个参数?

因为你实际上拥有的是一个方法表达式,并且你正在调用该方法表达式。

让我们详细看看:

Employees.structName
Run Code Online (Sandbox Code Playgroud)

是一个方法表达式,并且是一个可调用函数。它的签名是方法的签名structName,以接收者为前缀的参数列表。所以 的类型Employees.structName是:

func(main.Employees, ...main.Employees)
Run Code Online (Sandbox Code Playgroud)

您可以通过传递 4 个员工来调用此函数,其中第一个员工将是接收者,只有剩下的 3 个员工将用作参数names。所以只有从第二个开始的名字才会被打印。