Cannot assign to struct field in a map

后端 未结 2 594
小鲜肉
小鲜肉 2021-02-01 14:00

I have the data structure like this:

type Snapshot struct {
  Key   string
  Users []Users
}

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

// then did the initial         


        
相关标签:
2条回答
  • 2021-02-01 14:16

    What I ended up doing to use my struct map in a loop was the following:

    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)
    }
    

    Output should be:

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

    It's not appending, but should work to assign multiple values to a struct map, alternatively you could do the following and allow the map to reference its own values:

    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)
    }
    

    Which should output:

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

    Note that no errors are raised when we reference an empty struct value, this is because when we initialize our struct, its values start out as empty values but not nil (0 for int, "" for string, etc.)

    0 讨论(0)
  • 2021-02-01 14:30

    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:

    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 0

    Then 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.

    0 讨论(0)
提交回复
热议问题