奇怪的方法输出
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)
}
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。
我对我的简单程序的输出感到困惑。我希望在输出中得到所有四个名字,但我无法在输出中得到第一个名字。请帮我解决这个问题,或者一些关于那个的资源。
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 中没有“静态”方法。要调用方法,您必须具有接收者类型的值,并在该值上调用该方法。
所以你必须这样称呼它:
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。