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

在地图的结构上调用指针方法

在地图的结构上调用指针方法

Go
慕尼黑5688855 2021-04-30 14:27:14
有公司类型,这是一个结构,其中包含一个人的地图,这也是所有结构。type Company struct {    employees map[int]Person}type Person struct {    [...]}在将一些Person分配给employees-map之后,我试图在每个这些上调用一个指针方法。func (company *Company) Populate(names []string) {    for i := 1; i <= 15; i++ {        company.employees[i] = Person{names[i - 1], [...]}        company.employees[i].Initialize()    }}不幸的是,这失败了,go-Compiler抱怨我无法在company.employees [i]上调用指针方法,并且我无法获得company.employees [i]的地址。但是,将Initialize-method设置为非指针方法,并让其返回person的副本,然后通过使用再次将其分配给mapcompany.employees[i] = company.employees[i].Initialize()的作品,没有什么不同。从来没有使用过指针,这让我很烦。地图不是一成不变的,它们都可以通过两种方式修改,因此在地图中的实体上调用指针方法应该不是问题-至少在我脑海中。如果有人可以向我解释我在这里做错了什么-或纠正了我的想法-我会很高兴的。
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

这里的问题是,为了调用指针方法,employees[i]需要获取地址。根据Go规范:

操作数必须是可寻址的,即变量,指针间接寻址或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。除可寻址性要求外,x还可为复合文字。

地图索引操作不可寻址。决定这样做是为了使映射实现不必保证值的地址不会更改。随着更多数据添加到地图中,出于效率考虑,它可能会重新定位数据。

那么,如何解决呢?如果您有一个map[int]*Person,则无需获取映射中数据的地址,因为映射值已经是一个地址。

最后一点建议Person.Initialize()是,不是很惯用的Go代码。如果需要初始化类型,通常使用NewPerson()函数。该NewPerson()函数将返回初始化的Person结构或指针。


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

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