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. ...
随机推荐
- Windows系统CMD命令bat脚本编写
复制文件(/y 表示不提示确认框,/-y 表示提示是否覆盖确认) echo "复制文件" copy /y D:\apache-zookeeper-3.6.3.tar.gz E:\l ...
- 【LeetCode】1135. Connecting Cities With Minimum Cost 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Kruskal算法 日期 题目地址:https://l ...
- 【LeetCode】170. Two Sum III - Data structure design 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数组+字典 平衡查找树+双指针 日期 题目地址:htt ...
- 【LeetCode】377. Combination Sum IV 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】622. Design Circular Queue 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 用直的代替弯的 数组循环利用 日期 题目地址:htt ...
- 教你Python字符串的基本操作:拆分和连接
摘要:由于字符串数据几乎无处不在,因此掌握有关字符串的交易工具非常重要.幸运的是,Python 使字符串操作变得非常简单,尤其是与其他语言甚至旧版本的 Python 相比时. 本文分享自华为云社区&l ...
- OverFeat:Integrated Recognition, Localization and Detection using Convolutional Networks
目录 概 主要内容 Sermanet P., Eigen D., Zhang X., Mathieu M., Fergus R., LeCun Y. OverFeat:integrated recog ...
- 图片 Augmentation整理
目录 Augmentation Flipping 翻转 Grayscale Equalize 均衡直方图 Posterize 减少颜色通道位数 Cropping Rotation Translatio ...
- Java高效开发-SSH+Wireshark+tcpdump组合拳
目标 实现抓取远程服务器的数据包在wireshark中展示,不需要频繁使用tcpdump抓包后保存为cap数据包,在进行从服务器下载进行解析: 工具 1.ssh win10默认没有开启ssh服务端的, ...
- [GDOI2021 Day2T1] 宝石
题目大意 \(n\)个点的树, 树上每一个点有一个宝石\(w_i\), 给出一个固定的数字不重复的序列\(p_i\)和一些询问\(u_i, v_i\), 对于每一个询问求出\(u_i\)到\(v_i\ ...