奇怪的方法输出

Strange method output

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

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)
}

Code in go Playground

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

所以你必须这样称呼它:

var e Employees
e.structName(chandran, darpan, ishaan, manbir)

或者简单地说:

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

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

[{Chandran} {Darpan} {Ishaan} {Manbir}]

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

因为您实际上拥有的是 method expression,并且您正在调用该方法表达式。

我们详细看一下:

Employees.structName

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

func(main.Employees, ...main.Employees)

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

根据语言规范:

https://go.dev/ref/spec#Method_expressions

表达式

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

相当于:

chandran.strucName(darpan,ishaan,manbir)

这是因为函数的第一个参数 Employees.structName 被解释为方法的接收者。

如果你这样做:

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

它将打印所有四个元素。

我认为你应该命名你的 Strut Employee 而不是 Employees。因为它只代表一名员工。如果您想对一组(部分)员工使用方法。

type Employee struct {
    Name string
}

type Employees struct {
    employees []Employee
} 

然后在该组类型 Employees 上定义函数:

func (e *Employees) Add(names ...Employee) {
    e.employees = append(e.employees, names...)
}

func (e Employees) structName() {
    fmt.Println(e.employees)
}

我在 Go Playground 上用 Add 和 StructName 函数做了一个 Demo