无法分配给地图中的结构字段

新手上路,请多包涵

我有这样的数据结构:

 type Snapshot struct {
  Key   string
  Users []Users
}

snapshots := make(map[string] Snapshot, 1)

// then did the initialization
snapshots["test"] = Snapshot {
  Key: "testVal",
  Users: make([]Users, 0),
}

Users 是另一个结构。

然后,当我尝试在用户切片中添加一些新的 Users 值时,如下所示:

 snapshots["test"].Users = append(snapshots["test"].Users, user)

我不断收到此错误:

 cannot assign to struct field snapshots["test"].Users in map

还尝试了这里的解决方法 https://github.com/golang/go/issues/3117 就像这样:

 tmp := snapshots["test"].Users
tmp = append(tmp, user)
snapshots["test"].Users = tmp

但没有运气,仍然是完全相同的错误。

并且还尝试用指针声明地图,所以: snapshots := make(map[string] *Snapshot, 1) ,仍然没有运气。

原文由 lnshi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 702
2 个回答

首先,对于这个问题,这篇文章中的解决方案 为什么在将值设置为结构作为映射中的值时出现“无法分配”错误? 工作得很好。

然后,终于想通了为什么在我已经更改为使用指针后我的案例仍然不起作用,请参考下面非常简单的代码:

 a := make([]int, 3)
fmt.Println(len(a))

b := make(map[string]string, 3)
fmt.Println(len(b))

你认为输出会是什么?我只是认为这一切都是: 3 ,但实际上对于地图,输出将是 0

然后在地图初始化过程中,我使用了一个 for 循环并使用这个值 len(snapshots) ,这意味着初始化过程永远不会运行……

是的,就是这个原因。

原文由 lnshi 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于那些寻找更简单示例的人:

这是错误的:

 type myStruct struct{
   Field int
}

func main() {
   myMap := map[string]myStruct{
        "key":{
            Field: 1,
        },
   }

   myMap["key"].Field = 5
}

因为 myMap["key"] 不是“可寻址的”。

这是对的:

 type myStruct struct{
   Field int
}

func main(){
   myMap := map[string]myStruct{
       "key":{
           Field: 1,
       },
   }

   // First we get a "copy" of the entry
   if entry, ok := myMap["key"]; ok {

       // Then we modify the copy
       entry.Field = 5

       // Then we reassign map entry
       myMap["key"] = entry
   }

   // Now "key".Field is 5
   fmt.Println(myMap) // Prints map[key:{5}]
}

Here 你有一个工作示例。

原文由 Jairo Lozano 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题