debuggoMinor
Cannot assign to struct field in a map
Viewed 0 times
structfieldcannotassignmap
Problem
I have the data structure like this:
Then when I tried to append some new
I kept getting this error:
Also tried the workaround here https://github.com/golang/go/issues/3117 so like this:
But no luck, still exactly same error.
And also tried to declare the map with pointer, so:
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 is another struct.Then when I tried to append some new
Users values in the Users slice like this:snapshots["test"].Users = append(snapshots["test"].Users, user)I kept getting this error:
cannot assign to struct field snapshots["test"].Users in map
Also tried the workaround here https://github.com/golang/go/issues/3117 so like this:
tmp := snapshots["test"].Users
tmp = append(tmp, user)
snapshots["test"].Users = tmpBut no luck, still exactly same error.
And also tried to declare the map with pointer, so:
snapshots := make(map[string] *Snapshot, 1), still no luck.Solution
First, for this question, the solution in this post Why do I get a "cannot assign" error when setting value to a struct as a value in a map? works perfectly fine.
Then, finally figured out why after I already changed to use pointer my case still doesn't work, refer to the below very simple code:
What do think the output will be? I simply thought it is all would be:
Then later in the map initialization process, i used a for loop and with this value
Yea, that is the reason.
Then, finally figured out why after I already changed to use pointer my case still doesn't work, refer to the below very simple code:
a := make([]int, 3)
fmt.Println(len(a))
b := make(map[string]string, 3)
fmt.Println(len(b))What do think the output will be? I simply thought it is all would be:
3, but actually for the map, the output will be 0Then later in the map initialization process, i used a for loop and with this value
len(snapshots), that means the initialization process will never get run...Yea, that is the reason.
Code Snippets
a := make([]int, 3)
fmt.Println(len(a))
b := make(map[string]string, 3)
fmt.Println(len(b))Context
Stack Overflow Q#42605337, score: 18
Revisions (0)
No revisions yet.