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. spoj-SUBSUMS - Subset Sums

    SUBSUMS - Subset Sums Given a sequence of N (1 ≤ N ≤ 34) numbers S1, ..., SN (-20,000,000 ≤ Si ≤ 20, ...

  2. 基于内存的关系数据库memsql初探

    背景 广告系统中,算法模型预估需要根据广告的实时转化统计结果,才能做出更精准的预估:同时,支持多维度聚合查询(例如按照广告各个不同层级维度,按照时间不同粒度的维度),并跨大区合并.一开始的版本是基于m ...

  3. 团队编程二——web应用之人事管理系统

    该项目是B-S模式的web应用,以下是团队各成员的Coding链接: ------Aaric---https://coding.net/u/Aaric/p/Personnel_management_s ...

  4. rsync 守护进程及实时同步

    目录 rsync 守护进程及实时同步 rsync简介 rsync特性 rsync应用场景 cp命令 scp命令 rsync的传输方式 rsync的传输模式 rsync实际使用 rsync命令 案例 r ...

  5. Adversarial Training with Rectified Rejection

    目录 概 主要内容 rejection 实际使用 代码 Pang T., Zhang H., He D., Dong Y., Su H., Chen W., Zhu J., Liu T. Advers ...

  6. python 脚本或者flask 注册成为windows服务

    分享下脚本注册成为win服务 这个借鉴了其他大佬得 具体是谁忘记了有机会推荐 今天也是找了之前得改出来得 首先安装三个模块 最后一个是定时任务如果不需要可以不装 pip install psutil ...

  7. SpringBoot 之 Dao层模拟数据库操作

    单表操作: # src/main/java/com/wu/dao/DepartmentDao .java @Repository public class DepartmentDao { privat ...

  8. 初识python 之 爬虫:爬取双色球中奖号码信息

    人生还是要有梦想的,毕竟还有python.比如,通过python来搞一搞彩票(双色球).注:此文仅用于python学习,结果仅作参考.用到知识点:1.爬取网页基础数据2.将数据写入excel文件3.将 ...

  9. Selenium_环境安装(1)

    Selenium是一个用于Web应用程序自动化测试工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. Selenium基本上支持主流的浏览器,包括IE,Mozilla Firef ...

  10. 在CentOS7上安装 jq

    安装EPEL源: yum install epel-release 安装完EPEL源后,可以查看下jq包是否存在: yum list jq 安装jq: yum -y install jq 命令参考资料 ...