我有这样的数据结构:
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)
,仍然没有运气。
答案 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,""
用于字符串等)