Big*_*lue 7 methods struct pointers map go
有一个类型Company,它是一个结构,包含Person的地图,它也是所有结构.
type Company struct {
employees map[int]Person
}
type Person struct {
[...]
}
Run Code Online (Sandbox Code Playgroud)
在将一些Person分配给employees-map之后,我正试图在每个Person上调用指针方法.
func (company *Company) Populate(names []string) {
for i := 1; i <= 15; i++ {
company.employees[i] = Person{names[i - 1], [...]}
company.employees[i].Initialize()
}
}
Run Code Online (Sandbox Code Playgroud)
这很糟糕,go-Compiler抱怨我不能在company.employees [i]上调用指针方法,而且我不能取公司地址[i].但是,将Initialize-method设置为非指针方法并让它返回该人的副本,并使用它再次将其分配给地图
company.employees[i] = company.employees[i].Initialize()
Run Code Online (Sandbox Code Playgroud)
工作,没有那么不同.
没有使用指针,这非常困扰我.Map不是不可变的,并且它们都会被修改,所以在地图中的实体上调用指针方法应该不是问题 - 至少在我脑海中.
如果有人能向我解释我在这里做错了什么 - 或者纠正我的想法 - 我会很高兴.
Ste*_*erg 12
这里的问题是,为了调用指针方法,employees[i]需要采取的地址.根据Go规范:
操作数必须是可寻址的,即,变量,指针间接或切片索引操作; 或可寻址结构操作数的字段选择器; 或者可寻址数组的数组索引操作.作为可寻址性要求的例外,x也可以是复合文字.
地图索引操作不可寻址.这是因为地图实现不需要保证值的地址不会改变.随着更多数据被添加到地图中,它可能出于效率原因重新定位数据.
那么,你怎么解决它?如果您有map[int]*Person,则不需要获取地图中数据的地址,因为地图值已经是地址.
最后一点建议,Person.Initialize()不是非常惯用的Go代码.如果需要初始化类型,通常使用NewPerson()函数.该NewPerson()函数将返回初始化的Person结构或指针.