无法分配给地图中的struct字段

时间:2017-03-05 06:42:19

标签: go

我有这样的数据结构:

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切片中添加一些新的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),仍然没有运气。

2 个答案:

答案 0 :(得分:4)

首先,对于这个问题,这篇文章Why do I get a "cannot assign" error when setting value to a struct as a value in a map?中的解决方案完全正常。

然后,终于找到了为什么在我已经改变使用指针之后,我的情况仍然不起作用,请参考下面非常简单的代码:

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

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

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

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

是的,这就是原因。

答案 1 :(得分:0)

我最终在循环中使用结构映射的目的是:

type testStruct struct {
  a string
  b int
}

func main() {
  mapTest := make(map[string]testStruct)
  abc := [3]string{"a", "b", "c"}

  for i := 0; i < len(abc); i++ {
    var temp testStruct
    temp.a = abc[i]
    temp.b = i
    mapTest[abc[i]] = temp
  }

  fmt.Println(mapTest)
}

输出应为:

map[b:{b 1} c:{c 2} a:{a 0}]

它不是附加的,但应该可以为结构映射分配多个值,或者,您可以执行以下操作并允许映射引用其自身的值:

func main() {
  mapTest := make(map[string]testStruct)

  abc := [3]string{"a", "b", "c"}
  for i := 0; i < len(abc)*2; i++ {
    temp := mapTest[abc[i%3]]
    temp.a = abc[i%3]
    temp.b = temp.b + i
    mapTest[abc[i%3]] = temp
  }

  fmt.Println(mapTest)
}

应输出:

map[a:{a 3} b:{b 5} c:{c 7}]

请注意,当我们引用一个空的struct值时,不会引发任何错误,这是因为在初始化struct时,其值开始为空值,但不是nil({0表示int,""用于字符串等)