Go语言调用结构体方法时输出缺失第一个员工姓名问题求解
问题根因
你遇到的输出缺失问题是Go方法的调用规则导致的:
Go中定义的带接收者的方法,本质是将接收者作为第一个入参的普通函数。你代码中定义的func (e Employees) structName(names ...Employees)方法,等价于签名为func structName(e Employees, names ...Employees)的普通函数。
你调用时使用了Employees.structName(chandran, darpan, ishaan, manbir)这种类型调用的写法,第一个传入的chandran会被当做接收者e使用,只有后面3个参数会被传入可变参数names,最终输出自然少了第一个姓名。
修复方案
方案1:将方法改为普通函数(更合理)
你的structName逻辑完全没有用到接收者e,不需要定义为结构体方法,直接改成普通函数即可:
import "fmt" type Employees struct { Name string } func main() { chandran := Employees{Name: "Chandran"} darpan := Employees{Name: "Darpan"} ishaan := Employees{Name: "Ishaan"} manbir := Employees{Name: "Manbir"} structName(chandran, darpan, ishaan, manbir) } // 去掉接收者,改为普通函数 func structName(names ...Employees){ fmt.Println(names) }
方案2:保留方法,调整调用写法
如果你需要保留方法定义,调用时可以使用实例调用的形式,接收者传一个无意义的空实例即可:
import "fmt" 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方法分为值接收者和指针接收者两种,无论哪种,方法本质都是把接收者作为第一个参数的函数
- 方法有两种调用形式:实例调用
instance.Method(args)、类型调用Type.Method(receiver, args)
内容的提问来源于stack exchange,提问作者Fuad Suleymanov
相关产品推荐
相关产品推荐

