为了账号安全,请及时绑定邮箱和手机立即绑定

奇怪的方法输出

奇怪的方法输出

Go
慕后森 2022-10-17 15:45:08
我对我的简单程序的输出感到困惑。我希望在输出中获得所有四个名称,但我无法在输出中获得第一个名称。请帮我清除这个,或者一些关于那个的资源。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 中的代码
查看完整描述

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参数。所以只会打印从第二个开始的名称。


查看完整回答
反对 回复 2022-10-17
?
慕盖茨4494581

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)

它将打印所有四个元素。


查看完整回答
反对 回复 2022-10-17
?
九州编程

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 。


查看完整回答
反对 回复 2022-10-17
  • 3 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信