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中结构体和结构体指针的内存管理的更多相关文章

  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. protoc格式生成java文件

    下载protoc.exe 地址:https://yvioo.lanzoui.com/i12opqs7q9g 下载好之后 ,把protoc文件和exe放在一个文件夹内 用记事本打开protoc,删掉包路 ...

  2. IDEA安装vue.js插件后,new没有Vue component

    首先要安装vue相关的插件vue.js 但是很多人安装vue.js右键发现没有vue Componment,解决方法如下 Settings>Editor>File and Code Tem ...

  3. 第四十七个知识点:什么是Fiat-Shamir变换?

    第四十七个知识点:什么是Fiat-Shamir变换? 只要Alice和Bob同时在线,Sigma协议能快速的完成Alice向Bob证明的任务.Alice向Bob发送承诺,Bob返回一个挑战,最后Ali ...

  4. Go语言练习 Rot13

    Go语言练习 Rot13 地址:https://tour.go-zh.org/methods/23 package main import ( "io" "os" ...

  5. 漫谈grpc 3:从实践到原理,带你参透 gRPC

    ​ 原文链接:万字长文 | 从实践到原理,带你参透 gRPC 大家好,我是煎鱼. gRPC 在 Go 语言中大放异彩,越来越多的小伙伴在使用,最近也在公司安利了一波,希望这一篇文章能带你一览 gRPC ...

  6. [算法笔记-题解]问题 D: 习题4-4 三个整数求最大值

    问题 D: 习题4-4 三个整数求最大值 [命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 12 MB 题目描述 有3个整数a, b, c,由键盘输入,输出其中最大的数. 输入 ...

  7. HTML网页设计基础笔记 • 【第2章 排列页面内容】

    全部章节   >>>> 本章目录 2.1 音频标签和视频标签 2.1.1 音频标签 2.1.2 视频标签 2.2 列表.div 以及 span 标签 2.2.1 列表标签 2. ...

  8. ORA-09925:Unable to create audit trail file 数据库启动失败

    问题描述:生产库停机加内存和CPU,重启完服务器,启动数据库报错. ORA-09925: Unable to create audit trail file Linux-x86_64 Error 2: ...

  9. docker启动emqx官方镜像,顺便启动exporter

    注意,我是把把官方镜像放到了自己的仓库 1.emqx官方镜像启动 docker run -d --name emqx31 -p 1883:1883 -p 8083:8083 -p 8883:8883 ...

  10. Linux常用命令,新手可以看看

    最近在温习了一些linux的命令,这里总结一下,博主使用的系统是Ubuntu,版本如下: 由于博主是做开发的,所有linux只会一些常用的命令,跟那些专业linux大牛当前没的比,为什么Ubuntu而 ...