golang中结构体和结构体指针的内存管理
p1是结构体,p2是结构体指针。
2. 声明并赋值结构体和结构体指针
- 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. 结构体赋值拷贝,结构体指针赋值引用
- // 结构体指针赋值
- p3 := &Person{name: "lisi", age: 25}
- p4 := p3
- fmt.Println(*p3, *p4)
- p3.name = "王五"
- fmt.Println(*p3, *p4)
4. 结构体中哪种数据类型不拷贝?
其实本质上都拷贝了,只不过由于数据存储方式的不同,导致拷贝的有些是数据,有些是内存地址(指针)
感觉拷贝:字符串、数组、整型等;感觉不拷贝:map、切片
- 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 {北京 河北省}}
- }
注意:对于那些默认拷贝的情况,可以改变为指针类型,让数据实现同步修改。
- 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 {北京 河北省}}
- }
golang中结构体和结构体指针的内存管理的更多相关文章
- 13深入理解C指针之---内存管理
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 内存管理对所有程序都很重要,主要包括显式内存管理和隐式内存管理.其中隐式内存管理主要是 ...
- 深入理解C++中的new/delete和malloc/free动态内存管理
malloc/free和new/delete的区别 malloc/free是C/C++标准库的函数:new/delete是C++操作符. malloc/free只是动态分配内存空间/释放空间:new/ ...
- 史林枫:sqlserver数据库中数据日志的压缩及sqlserver占用内存管理设置
使用sqlserver和IIS开发.net B/S程序时,数据量逐渐增多,用户也逐渐增多,那么服务器的稳定性就需要维护了.数据库如何占用更小内存,无用的日志如何瞬间清空? 今天在给一个客户维护网站的时 ...
- golang中的反射解析结构体标签tag
package main import ( "fmt" "reflect" ) type resume struct { // 反射解析结构体标签tag Nam ...
- iphone开发中使用nib(xib)文件的内存管理
iphoneuinavigationcontrollercocoauiviewvariableswindows 在使用nib文件做界面开发的过程中,加载nib文件后,由于设置了outlet和deleg ...
- 【荐】详解 golang 中的 interface 和 nil
golang 的 nil 在概念上和其它语言的 null.None.nil.NULL一样,都指代零值或空值.nil 是预先说明的标识符,也即通常意义上的关键字.在 golang 中,nil 只能赋值给 ...
- C#高级编程9 第14章 内存管理和指针
C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
- 六、golang中的结构体和方法、接口
结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...
随机推荐
- Spring学习(三)几种集合属性的注入方式
1.前言 众所周知.java中不只有八大简单类型.还有一些集合类型.本文围绕集合类型的注入做一个总结. 2.项目骨架 3.过程 1.创建实体类AllCollectionType package com ...
- 【LeetCode】1200. Minimum Absolute Difference 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序 日期 题目地址:https://leetcode ...
- 【LeetCode】563. Binary Tree Tilt 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...
- Unknown Treasure(hdu5446)
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- [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 ...
- [opencv]求像素范围中最大值与最小值
double minv = 0.0, maxv = 0.0; double* minp = &minv; double* maxp = &maxv; minMaxIdx(channel ...
- HTML网页设计基础笔记 • 【第3章 表单】
全部章节 >>>> 本章目录 3.1 表单 3.1.1 表单概述 3.1.1 表单概述(续) 3.1.2 表单标签 3.1.3 表单数据的提交方式 3.2 输入框和按钮 3 ...
- Nginx-正反向代理及负载均衡
目录 正/反向代理 代理的方式 Nginx代理服务支持的协议 代理实战 部署web01 部署Lb01 Nginx代理常用参数 添加发往后端服务器的请求头信息 代理到后端的TCP连接.响应.返回等超时时 ...
- hisql 与sqlsugar,freesql 数据插入性能测试
hisql与目前比较流行的ORM框架性能测试对比 hisql 一直定位为新一代的ORM框架 为低代码开发而生 测试数据数据库为sqlserver数据库 测试源码地址hisql与sqlsugar fre ...
- vue组件中的.sync修饰符使用
在vue的组件通信props中,一般情况下,数据都是单向的,子组件不会更改父组件的值,那么vue提供.sync作为双向传递的关键字,实现了父组件的变动会传递给子组件,而子组件的carts改变时,通过事 ...