Go map value赋值struct不生效

在Go语言中,当Map中的value为引用类型时是不可以原地修改的,如:

package main

type Student struct {
    Name string
    Id int
}

func main() {
    s := make(map[string]Student)
    s["2016001"] = Student{
        Name:"张三",
        Id:2016001,
    }
    s["2016001"].Name = "张三丰" //XXX 无效

}

在go中 map中的赋值属于值copy,就是在赋值的时候是把Student的完全复制了一份,复制给了map。而在go语言中,是不允许将其修改的。

但是如果map的value为int,是可以修改的,因为修改map中的int属于赋值的操作。

package main

type Student struct {
    Name string
    Id int
}

func main() {
    s1 := make(map[string]int)
    s1["张三丰"] = 2016002  //ok
}

那么,在go中如何修改map中的value?
------传指针

package main

import "fmt"

type Student struct {
    Name string
    Id int
}

func main() {
    s := make(map[string]*Student) //value存储结构体指针
    s["2016001"] = &Student{
        Name:"张三",
        Id:2016001,
    }
    s["2016001"].Name = 张三丰
    fmt.Println(s) //{2016001 张三丰”}
}

在结构体比较大的时候,用指针效率会更好,因为不需要值copy
如果map中的value为 *int指针类型,那么在赋值时不可以用&123,因为int为常亮,不占内存,没有内存地址

你可能感兴趣的:(Go map value赋值struct不生效)