首页 > 解决方案 > 无法分配给 mapMeasures[ts].Delta

问题描述

我有一个类型:

type Measure struct {
    Timestamp     time.Time
    Delta         float64
}

我正在将一组度量值转换为以时间戳为键的地图:

func MeasuresToMap(measures []models.Measure) map[string]models.Measure {
    mapMeasures := make(map[string]models.Measure, len(measures)) //
    for _, measure := range measures {
        mapMeasures[measure.Timestamp.Format(time.RFC3339)] = measure
    }
    return mapMeasures
}

我这样做:

mapMeasures := misc.MeasuresToMap(myMeasures)
for ts, _ := range mapMeasures {
        mapMeasures[ts].Delta = 0
    }

我得到:

Cannot assign to mapMeasures[ts].Delta

但我能做的:

for ts, measure := range mapMeasures {
        measure.Delta = 0
        mapMeasures[ts] = measure
    }

这两个选项有什么区别,为什么我不能直接更新 Delta 字段?

标签: go

解决方案


你不能分配给你无法获得地址的东西。

情况就是这样mapMeasures[ts].Delta = 0-您不能获取Measure. 以下是Go Programming Language (A. Donovan, B. Kernighan)书中关于获取地图元素地址的内容:

我们不能获取地图元素地址的一个原因是,增长地图可能会导致将现有元素重新散列到新的存储位置,从而可能使地址无效。

另一方面,当您for ts, measure := range mapMeasures {...}创建一个显式变量时measure,您可以获取它的地址并分配给它。


推荐阅读