【发布时间】:2018-07-27 08:15:54
【问题描述】:
我很难理解为什么我的代码在一种状态下存在错误,而在另一种状态下却没有。我已经有一段时间没有介绍指针了,所以我可能已经生疏了!
基本上我有一个存储库结构,用于在内存中存储一个对象,它有一个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
}
上述方法不起作用,起初看起来一切正常,但在稍后尝试访问数据时,映射中的条目都指向同一个 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 引用吗?我还尝试在for 循环中为指针p := &chart 创建一个新变量,但这也不起作用。
我应该避免在循环中生成指针吗?
【问题讨论】:
标签: for-loop pointers go mutex