以下代码能否编译?
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"])
}
答:编译失败。
map[string]Student 的 value 是一个 Student 结构值,所以当list["student"] = student,是一个值拷贝过程。而list[“student”]则是一个值引用。那么值引用的特点是只读。所以对list[“student”].Name = “LDB"的修改是不允许的。
如果真要修改需要New一个新的结构体,修改内容后重新赋值
//list["student"].Name = "LDB"
newStudent := list["student"]
newStudent.Name = "LDB"
list["student"] = newStudent
或者将map value 改为一个 Student 结构值指针 map[string]*Student
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"])
}