在golang中,切片和贴图都是引用类型.当您只需要修改切片/贴图中的元素时,切片/贴图成员的修改将"广播"到所有切片.例如,给定m1 := make(map[int]int); m2 := m1,m1[3] = 5将导致m2[3] == 5.
但是,当您尝试将新元素添加到这两种类型时,事情开始有所不同.如下例所示,添加到地图参数中的新元素将自动显示在参数中; 但是,添加到切片中的新元素在参数中被"丢弃".
问题是,为什么这有区别?
func editMap(m map[int]int) {
m[3] = 8
m[4] = 9
}
func editSlice(s []int) {
s = append(s, 5)
s = append(s, 9)
}
func main() {
m := make(map[int]int, 0)
m[1] = 5
m[2] = 3
fmt.Printf("%v\n", m) //map[1:5 2:3]
editMap(m)
fmt.Printf("%v\n", m) //map[1:5 2:3 3:8 4:9]
s := make([]int, 2)
s[0] = 2
s[1] = 5
fmt.Printf("%v\n", s) //[2 …Run Code Online (Sandbox Code Playgroud)