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

有公司类型,这是一个结构,其中包含一个人的地图,这也是所有结构。


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的副本,然后通过使用再次将其分配给map


company.employees[i] = company.employees[i].Initialize()

的作品,没有什么不同。


从来没有使用过指针,这让我很烦。地图不是一成不变的,它们都可以通过两种方式修改,因此在地图中的实体上调用指针方法应该不是问题-至少在我脑海中。


如果有人可以向我解释我在这里做错了什么-或纠正了我的想法-我会很高兴的。


慕尼黑5688855
浏览 170回答 2
2回答

aluckdog

这里的问题是,为了调用指针方法,employees[i]需要获取地址。根据Go规范:操作数必须是可寻址的,即变量,指针间接寻址或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。除可寻址性要求外,x还可为复合文字。地图索引操作不可寻址。决定这样做是为了使映射实现不必保证值的地址不会更改。随着更多数据添加到地图中,出于效率考虑,它可能会重新定位数据。那么,如何解决呢?如果您有一个map[int]*Person,则无需获取映射中数据的地址,因为映射值已经是一个地址。最后一点建议Person.Initialize()是,不是很惯用的Go代码。如果需要初始化类型,通常使用NewPerson()函数。该NewPerson()函数将返回初始化的Person结构或指针。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go