因为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时,就发生了不可寻址的错误。

正确的做法有:

  1. 重新覆盖,既然无法单独修改里面的某一项,那就全部都替换掉,u.school[“highSchool”] = school{Teacher:“曹老师”, Name:“XX第二中学”}

  2. 改为储存指针,把map[string]school 改为 map[string]*school,把school的指针存进去,这样go就可以寻址,从而可以修改里面的值