go - 无法分配给 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 字段?
解决方案
你不能分配给你无法获得地址的东西。
情况就是这样mapMeasures[ts].Delta = 0
-您不能获取Measure
. 以下是Go Programming Language (A. Donovan, B. Kernighan)书中关于获取地图元素地址的内容:
我们不能获取地图元素地址的一个原因是,增长地图可能会导致将现有元素重新散列到新的存储位置,从而可能使地址无效。
另一方面,当您for ts, measure := range mapMeasures {...}
创建一个显式变量时measure
,您可以获取它的地址并分配给它。
推荐阅读
- c# - 如何获取 ClickOnce 创建的本地应用程序数据文件夹中文件的路径
- azure - 使用 NGINX Ingress 进行 Kubernetes 角色管理
- angular - 如何在 ProductListComponentService 中修改 pageSize
- active-directory - 使用 Google G Suite 创建分发列表(邮寄列表组)
- java - 循环遍历一个字符串并在 Java 中只返回一个字符
- ubuntu - 由于缺少 liblibxcb-xtest0,无法在 ubuntu 上安装 zoom - 但无法安装?
- wordpress - 如何在 WordPress Woocommerce 中删除或添加产品网格?
- javascript - Node.js Paypal sdk:签证卡不起作用
- amazon-web-services - 在 AWS Amplify API 和 DynamoDB 中使用空字符串
- powershell - 当组标识符靠近 PowerShell 中的变量时,字符串替换不起作用