我很难理解为什么我在一个州的代码中有bug,而在另一个州却没有.我已经有一段时间没有讨论过指针了,所以我可能已经生疏了!
基本上,我有一个存储库 struct ,用来在内存中存储一个对象,它有一个Store
函数.
type chartsRepository struct {
mtx sync.RWMutex
charts map[ChartName]*Chart
}
func (r *chartsRepository) Store(c *Chart) error {
r.mtx.Lock()
defer r.mtx.Unlock()
r.charts[c.Name] = c
return nil
}
因此,它所做的就是设置一个RW互斥锁,并将指针添加到一个由标识符引用的映射.
然后,我得到了一个函数,它基本上循环遍历这些对象的一部分,将它们全部存储在存储库中.
type service struct {
charts Repository
}
func (svc *service) StoreCharts(arr []Chart) error {
hasError := false
for _, chart := range arr {
err := svc.repo.Store(&chart)
// ... error handling
}
if hasError {
// ... Deals with the error object
return me
}
return nil
}
上面的方法不起作用,起初看起来一切正常,但是在稍后try 访问数据时,映射中的所有条目都指向相同的Chart
对象,尽管具有不同的键.
如果我执行以下操作并将指针引用移动到另一个函数,则一切都按预期进行:
func (svc *service) StoreCharts(arr []Chart) error {
// ...
for _, chart := range arr {
err := svc.storeChart(chart)
}
// ...
}
func (svc *service) storeChart(c Chart) error {
return svc.charts.Store(&c)
}
我假设问题是,因为循环覆盖了for
循环中对chart
的引用,指针引用也会改变.当指针在独立函数中生成时,该引用永远不会被覆盖.是这样吗?
我觉得自己很愚蠢,但是指针不应该是由&chart
生成的吗?这不是独立于chart
引用的吗?我还try 为for
循环中的指针p := &chart
创建一个新变量,但也没有成功.
我应该避免在循环中生成指针吗?