3 回答
TA贡献1806条经验 获得超5个赞
Go 中没有“静态”方法。要调用方法,您必须具有接收者类型的值,并在该值上调用方法。
所以你必须这样称呼它:
var e Employees
e.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参数。所以只会打印从第二个开始的名称。
TA贡献1850条经验 获得超11个赞
根据语言规范:
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)
它将打印所有四个元素。
TA贡献1785条经验 获得超4个赞
我认为您应该命名您的 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 。
- 3 回答
- 0 关注
- 78 浏览
添加回答
举报