结构体中的slice、map如何传递?
1. 运行环境
GOLANG 2022.1
2. 问题描述?
结构体的传递类型为值传递,slice和map的传递类型为引用传递。
下面这个代码实验出来在结构体中的slice和map的传递类型还是引用传递,将p1赋值给p2,修改p2中的slice和map,p1中的也会修改,为什么呢?不应该结构体只进行值拷贝吗?
package main
import "fmt"
type Person struct {
Name string
Age int
Scores [5]float64
ptr *int
slice []int
map1 map[string]string
}
func main() {
var p1 Person
fmt.Println(p1) // { 0 [0 0 0 0 0] <nil> [] map[]}
p1.slice = make([]int, 5)
p1.slice[3] = 23
p1.map1 = make(map[string]string)
p1.map1["name"] = "xwy"
p1.Age = 18
fmt.Println("map修改后:", p1)
p2 := p1
p2.map1["add"] = "北京路"
p2.Age = 2323
p2.slice[3] = 19
p2.Scores[2] = 100
p2.ptr = &p2.Age
fmt.Println("p1:", p1)
fmt.Println("p2:", p2)
fmt.Printf("p1的地址:%p\n", &p1)
fmt.Printf("p2的地址:%p\n", &p2)
}
值传递的时候只是拷贝对应的结构,所以p1和p2都指向同一块内存地址,当p2的内存里面的数据发生改变后p1也会发生改变