结构体中的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)
}

4. 您实际得到的结果?

Go

讨论数量: 6

值传递的时候只是拷贝对应的结构,所以p1和p2都指向同一块内存地址,当p2的内存里面的数据发生改变后p1也会发生改变

5天前 评论
ABCx (楼主) 5天前
xiaobai111 (作者) 5天前
ABCx (楼主) 5天前
xiaobai111 (作者) 5天前
ABCx (楼主) 5天前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!