奇怪的方法输出

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


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)

}

Go Playground 中的代码


慕后森
浏览 79回答 3
3回答

忽然笑

Go 中没有“静态”方法。要调用方法,您必须具有接收者类型的值,并在该值上调用方法。所以你必须这样称呼它:var e Employeese.structName(chandran, darpan, ishaan, manbir)或者简单地说:Employees{}.structName(chandran, darpan, ishaan, manbir)这两个输出(在Go Playground上试试):[{Chandran} {Darpan} {Ishaan} {Manbir}]为什么你的版本省略了第一个参数?因为您拥有的实际上是一个方法表达式,而您正在调用该方法表达式。让我们详细看看它:Employees.structName是一个方法表达式,它是一个可调用函数。它的签名是structName方法的签名,参数列表以接收者为前缀。所以类型Employees.structName是:func(main.Employees, ...main.Employees)您通过传递 4 个员工来调用它,其中第一个将是接收者,只有剩下的 3 个将用作names参数。所以只会打印从第二个开始的名称。

慕盖茨4494581

根据语言规范: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 员工而不是员工。因为它只代表一名员工。如果您想在一组(切片)员工上使用方法。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)}我用Add 和 StructName 函数在 Go Playground 上做了一个Demo 。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go