go多维map读写操作的问题
因为go是静态语言,所以。。。在构造和读取多维map的操作的时候就显得木有PHP那么方便鸟,常常报错
cannot take the address of xxx // or cannot assign to xxx
这会很让人抓狂。。
关于cannot assign to xxx错误
来看代码
package main
import "fmt"
func main() {
m := make(map[int][2]int)
m[0] = [2]int{1, 3}
m[0][1] = 2 //错误
fmt.Println(m[0][1])
打开这里运行: http://play.golang.org/p/hMPk_N20XJ
关于cannot take the address of xxx
这个错误的原因和前面的是一致的,原因都是无法寻址
package main
import "fmt"
type user struct {
name string
age int
school map[string]school
}
type school struct {
Teacher string
Name string
}
func main() {
s := map[string]school{"primarySchool":{Teacher:"李老师", Name:"XX小学"}, "highSchool":{Teacher:"曹老师", Name:"XX中学"}}
u := user{name:"张三",age:12,school:s}
u.school["highSchool"].Name = "XX第二中学"//错误
fmt.Println(u)
}
打开这里运行:http://play.golang.org/p/Jpz6ZlASTZ
原因出在user 中的 map[string]school 这里, u.school[“highSchool”] 访问到这里都没有问题,问题在于后面的 “ .Name ” ,因为map[string]school 中储存的school是数值拷贝,当要修改school里面的Name时,就发生了不可寻址的错误。
正确的做法有:
重新覆盖,既然无法单独修改里面的某一项,那就全部都替换掉,u.school[“highSchool”] = school{Teacher:“曹老师”, Name:“XX第二中学”}
改为储存指针,把map[string]school 改为 map[string]*school,把school的指针存进去,这样go就可以寻址,从而可以修改里面的值