更新时间:

#golang map 值拷贝,value赋值

package main

import "fmt"

type Student struct {
	Name string
}

var list map[string]Student

func main() {

	list = make(map[string]Student)

	student := Student{"Aceld"}

	list["student"] = student
	list["student"].Name = "LDB" // 只读

	fmt.Println(list["student"])

   // --------方法1:-------------
    tmpStudent := list["student"]
    tmpStudent.Name = "LDB" // 拿出来,改完再放回去
    list["student"] = tmpStudent

    fmt.Println(list["student"])
   // 是先做一次值拷贝,做出一个tmpStudent副本,然后修改该副本,然后再次发生一次值拷贝复制回去,
   // list["student"] = tmpStudent,但是这种会在整体过程中发生2次结构体值拷贝,性能很差。

    // ------方法2-- 常用 ----
    list = make(map[string]*Student) // 保存也是指针

    list["student"] = &student
    list["student"].Name = "LDB"
    // 我们实际上每次修改的都是指针所指向的Student空间,指针本身是常指针,不能修改,只读属性,
    // 但是指向的Student是可以随便修改的,而且这里并不需要值拷贝。只是一个指针的赋值。

}

cannot assign to struct field list["student"].Name in map

map[string]Student 的value是一个Student结构值,所以当list["student"] = student,是一个值拷贝过程。而list["student"]则是一个值引用。那么值引用的特点是只读。所以对list["student"].Name = "LDB"的修改是不允许的。