有公司类型,这是一个结构,其中包含一个人的地图,这也是所有结构。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结构或指针。
- 2 回答
- 0 关注
- 169 浏览
添加回答
举报
0/150
提交
取消