p1是结构体,p2是结构体指针。

2. 声明并赋值结构体和结构体指针

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Person struct {
  6. name string
  7. age int
  8. }
  9.  
  10. func main() {
  11. // 初始化结构体(创建一个结构体对象)
  12. p1 := Person{"张三", 18}
  13. fmt.Println(p1.name, p1.age)
  14.  
  15. // 初始化结构体指针
  16. p2 := &Person{"李四", 28}
  17. fmt.Println(p2.name, p2.age)
  18.  
  19. // new方法先声明结构体指针,在赋值
  20. var p3 = new(Person)
  21. p3.name = "王五"
  22. p3.age = 38
  23. fmt.Println(p3.name, p3.age)
  24.  
  25. }

  

3. 结构体赋值拷贝,结构体指针赋值引用

  1. // 结构体指针赋值
  2. p3 := &Person{name: "lisi", age: 25}
  3. p4 := p3
  4. fmt.Println(*p3, *p4)
  5. p3.name = "王五"
  6. fmt.Println(*p3, *p4)

  

4. 结构体中哪种数据类型不拷贝?

  其实本质上都拷贝了,只不过由于数据存储方式的不同,导致拷贝的有些是数据,有些是内存地址(指针)

  感觉拷贝:字符串、数组、整型等;感觉不拷贝:map、切片

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Address struct {
  6. city, state string
  7. }
  8.  
  9. type Person struct {
  10. name string
  11. age int
  12. hobby [2]string
  13. num []int
  14. parent map[string]string
  15. Address
  16. }
  17.  
  18. func main() {
  19. // 在存在结构体嵌套是,赋值会拷贝一份所有的数据
  20. p1 := Person{
  21. name: "liSi",
  22. age: 18,
  23. hobby: [2]string{"乒乓", "CF"},
  24. parent: map[string]string{"name": "maYaNan"},
  25. num: []int{11, 22},
  26. Address: Address{city: "北京", state: "河北省"},
  27. }
  28. p2 := p1
  29. p1.Address.city = "天津" // 嵌套的结构体拷贝了
  30. p1.hobby[0] = "gaga" // 数组拷贝了
  31. p1.num[0] = 88 // 切片没拷贝 (内部维护指针指向数据存储的地方)
  32. p1.parent["name"] = "maYaJun" // map没拷贝 (内部维护指针指向数据存储的地方)
  33. fmt.Println(p1) // {lisi 18 {天津 河北省}}
  34. fmt.Println(p2) // {lisi 18 {北京 河北省}}
  35. }

  注意:对于那些默认拷贝的情况,可以改变为指针类型,让数据实现同步修改。

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Address struct {
  6. city, state string
  7. }
  8.  
  9. type Person struct {
  10. name string
  11. age int
  12. hobby *[2]string
  13. num []int
  14. parent map[string]string
  15. Address
  16. }
  17.  
  18. func main() {
  19. // 在存在结构体嵌套是,赋值会拷贝一份所有的数据
  20. p1 := Person{
  21. name: "liSi",
  22. age: 18,
  23. hobby: &[2]string{"乒乓", "CF"},
  24. parent: map[string]string{"name": "maYaNan"},
  25. num: []int{11, 22},
  26. Address: Address{city: "北京", state: "河北省"},
  27. }
  28. p2 := p1
  29. p1.hobby[0] = "gaga" // 数组指针没有拷贝
  30. fmt.Println(*p1.hobby) // {lisi 18 {天津 河北省}}
  31. fmt.Println(*p2.hobby) // {lisi 18 {北京 河北省}}
  32. }

  

golang中结构体和结构体指针的内存管理的更多相关文章

  1. 13深入理解C指针之---内存管理

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 内存管理对所有程序都很重要,主要包括显式内存管理和隐式内存管理.其中隐式内存管理主要是 ...

  2. 深入理解C++中的new/delete和malloc/free动态内存管理

    malloc/free和new/delete的区别 malloc/free是C/C++标准库的函数:new/delete是C++操作符. malloc/free只是动态分配内存空间/释放空间:new/ ...

  3. 史林枫:sqlserver数据库中数据日志的压缩及sqlserver占用内存管理设置

    使用sqlserver和IIS开发.net B/S程序时,数据量逐渐增多,用户也逐渐增多,那么服务器的稳定性就需要维护了.数据库如何占用更小内存,无用的日志如何瞬间清空? 今天在给一个客户维护网站的时 ...

  4. golang中的反射解析结构体标签tag

    package main import ( "fmt" "reflect" ) type resume struct { // 反射解析结构体标签tag Nam ...

  5. iphone开发中使用nib(xib)文件的内存管理

    iphoneuinavigationcontrollercocoauiviewvariableswindows 在使用nib文件做界面开发的过程中,加载nib文件后,由于设置了outlet和deleg ...

  6. 【荐】详解 golang 中的 interface 和 nil

    golang 的 nil 在概念上和其它语言的 null.None.nil.NULL一样,都指代零值或空值.nil 是预先说明的标识符,也即通常意义上的关键字.在 golang 中,nil 只能赋值给 ...

  7. C#高级编程9 第14章 内存管理和指针

    C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...

  8. Swift中的可选链与内存管理(干货系列)

    干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...

  9. 六、golang中的结构体和方法、接口

    结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...

随机推荐

  1. Spring学习(三)几种集合属性的注入方式

    1.前言 众所周知.java中不只有八大简单类型.还有一些集合类型.本文围绕集合类型的注入做一个总结. 2.项目骨架 3.过程 1.创建实体类AllCollectionType package com ...

  2. 【LeetCode】1200. Minimum Absolute Difference 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序 日期 题目地址:https://leetcode ...

  3. 【LeetCode】563. Binary Tree Tilt 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  4. Unknown Treasure(hdu5446)

    Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  5. [Kaiming]Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

    目录 概 主要内容 PReLU Kaiming 初始化 Forward case Backward case He K, Zhang X, Ren S, et al. Delving Deep int ...

  6. [opencv]求像素范围中最大值与最小值

    double minv = 0.0, maxv = 0.0; double* minp = &minv; double* maxp = &maxv; minMaxIdx(channel ...

  7. HTML网页设计基础笔记 • 【第3章 表单】

    全部章节   >>>> 本章目录 3.1 表单 3.1.1 表单概述 3.1.1 表单概述(续) 3.1.2 表单标签 3.1.3 表单数据的提交方式 3.2 输入框和按钮 3 ...

  8. Nginx-正反向代理及负载均衡

    目录 正/反向代理 代理的方式 Nginx代理服务支持的协议 代理实战 部署web01 部署Lb01 Nginx代理常用参数 添加发往后端服务器的请求头信息 代理到后端的TCP连接.响应.返回等超时时 ...

  9. hisql 与sqlsugar,freesql 数据插入性能测试

    hisql与目前比较流行的ORM框架性能测试对比 hisql 一直定位为新一代的ORM框架 为低代码开发而生 测试数据数据库为sqlserver数据库 测试源码地址hisql与sqlsugar fre ...

  10. vue组件中的.sync修饰符使用

    在vue的组件通信props中,一般情况下,数据都是单向的,子组件不会更改父组件的值,那么vue提供.sync作为双向传递的关键字,实现了父组件的变动会传递给子组件,而子组件的carts改变时,通过事 ...