golang中结构体和结构体指针的内存管理
p1是结构体,p2是结构体指针。
2. 声明并赋值结构体和结构体指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package main import "fmt" type Person struct { name string age int } func main() { // 初始化结构体(创建一个结构体对象) p1 := Person{ "张三" , 18} fmt.Println(p1.name, p1.age) // 初始化结构体指针 p2 := &Person{ "李四" , 28} fmt.Println(p2.name, p2.age) // new方法先声明结构体指针,在赋值 var p3 = new(Person) p3.name = "王五" p3.age = 38 fmt.Println(p3.name, p3.age) } |
3. 结构体赋值拷贝,结构体指针赋值引用
1 2 3 4 5 6 | // 结构体指针赋值 p3 := &Person{name: "lisi" , age: 25} p4 := p3 fmt.Println(*p3, *p4) p3.name = "王五" fmt.Println(*p3, *p4) |
4. 结构体中哪种数据类型不拷贝?
其实本质上都拷贝了,只不过由于数据存储方式的不同,导致拷贝的有些是数据,有些是内存地址(指针)
感觉拷贝:字符串、数组、整型等;感觉不拷贝:map、切片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package main import "fmt" type Address struct { city, state string } type Person struct { name string age int hobby [2]string num []int parent map [string]string Address } func main() { // 在存在结构体嵌套是,赋值会拷贝一份所有的数据 p1 := Person{ name: "liSi" , age: 18, hobby: [2]string{ "乒乓" , "CF" }, parent: map [string]string{ "name" : "maYaNan" }, num: []int{11, 22}, Address: Address{city: "北京" , state: "河北省" }, } p2 := p1 p1.Address.city = "天津" // 嵌套的结构体拷贝了 p1.hobby[0] = "gaga" // 数组拷贝了 p1.num[0] = 88 // 切片没拷贝 (内部维护指针指向数据存储的地方) p1.parent[ "name" ] = "maYaJun" // map没拷贝 (内部维护指针指向数据存储的地方) fmt.Println(p1) // {lisi 18 {天津 河北省}} fmt.Println(p2) // {lisi 18 {北京 河北省}} } |
注意:对于那些默认拷贝的情况,可以改变为指针类型,让数据实现同步修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package main import "fmt" type Address struct { city, state string } type Person struct { name string age int hobby *[2]string num []int parent map [string]string Address } func main() { // 在存在结构体嵌套是,赋值会拷贝一份所有的数据 p1 := Person{ name: "liSi" , age: 18, hobby: &[2]string{ "乒乓" , "CF" }, parent: map [string]string{ "name" : "maYaNan" }, num: []int{11, 22}, Address: Address{city: "北京" , state: "河北省" }, } p2 := p1 p1.hobby[0] = "gaga" // 数组指针没有拷贝 fmt.Println(*p1.hobby) // {lisi 18 {天津 河北省}} fmt.Println(*p2.hobby) // {lisi 18 {北京 河北省}} } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)