结构体使用细节(1)|学习笔记

简介: 快速学习结构体使用细节(1)

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:结构体使用细节(1)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9673


结构体使用细节(1)

 

结构体的注意事项和使用细节1

1.结构体的所有字段在内存中是连续分布的

若结构里面有五个字段,这五个字段在内存里面的地址是连续分布的,连续分布的好处是可以通过地址的加减来快速获取某个字段的值,同时这种分布形式,也利于数据的查找。

举例一:

新建文件夹,命名为structdetails,新建一个文件main.go,输入共用代码:package main

import "fmt"

func main() {

为了看清效果,需要首先定义两个结构体。第一个结构体叫做point,该结构体有两个字段,一个字段是x,另一个字段是y,均为int类型,其代码为:

type Point struct {

x int

y int

第二个结构体叫做Rect,这个结构体由矩形的左上角(left up)和右下角(right down)的点共同构成,为Rect创建一个结构体,输入以下代码:

type Rect struct {

leftUp, rightDown Point

}

func main() {

r1:= Rect{Point{1,2},Point{3,4}}

如何证明他们是连续分布的呢?只有一个办法,就是打印,通过打印出他们的地址,观察他们的分布是不是连续的。输入fmt.Printf("r1.leftup.x 地址=%p r1.leftup.y 地址=%p r1.rightDown.x地址=%p r1.rightDown.y地址=%p \n",&r1.leftup.x, &r1.leftup.y, &r1.rightDown.x, &r1.rightDown.y)

进行调用,可以看到代码过于长,输入,进行换行。进入控制台,输入cd.chapter10,cd到structdetails,run.main.go完成运行,发现各个字符之间的地址刚好相差八个字节。

打印r1中4个int的地址,发现其在内存中是连续分布的

核心代码:

package main

import "fmt"

type Point struct {

x int

y int

}

type Rect struct {

leftUp, rightDown Point

}

func main() {

r1:= Rect{Point{1,2},Point{3,4}}

fmt.Printf("r1.leftup.x 地址=%p r1.leftup.y 地址=%p r1.rightDown.x地址=%p r1.rightDown.y地址=%p \n",&r1.leftup.x, &r1.leftup.y, &r1.rightDown.x, &r1.rightDown.y)

}

内存图:

image.png

内存分析图

在内存里面有一个r1变量,它直接指向了结构体,结构体有四个字段,第一个点(x点)的地址是Oxc042008340,第二个点的地址就是在第一个点地址的基础上加了八个字节,之所以加了八个字节是因为其数据类型是int型的,同样的道理,第三个点的地址又在第二个点的基础上加八个字节,即Oxc042008350,第四个点的位置又加了八个字节,表示结构体里面字段的数据是连续分布的,连续分布可以通过地址的加减快速获取某个字段的值。

举例二

如果rect里存放的不是具体的值,而是指针,那指针里面的内容就不一定是连续的。输入以下代码:

r2 := Rect2{&Point{10,20),&Point{30,40}}

fmt.Printf("r2.leftup本身地址=%p r2.rightDown本身地址=%p \n",

&r2.leftup, &r2.rightDown)

fmt.Printf("r2.leftup 指向地址=%p r2.rightDown 指向地址=p \n",

r2.1eftup,r2.rightDown)

}

创建一个结构体rect2,里面有左上角和右下角两个点,r2中存放的是指针,指针的内容是一个地址,而指针本身也有地址啊?r2中有两个*point,这两个*point的指针类型本身的地址是连续的,但是他们指向的地址不一定是连续的,是否连续要看系统在运行时是如何分配的。

内存图

image.png内存分析图

相关文章
|
Kubernetes 调度 容器
正确配置Kubelet可一定程度防止K8S集群雪崩
## Kubelet Node Allocatable - Kubelet Node Allocatable用来为Kube组件和System进程预留资源,从而保证当节点出现满负荷时也能保证Kube和System进程有足够的资源。 - 目前支持cpu, memory, ephemeral-storage三种资源预留。 - Node Capacity是Node的所有硬件资源,kube-r
11482 3
|
缓存 NoSQL 应用服务中间件
万字攻略,社招腾讯天美C++后台面经,面试题整理(上)
万字攻略,社招腾讯天美C++后台面经,面试题整理
|
数据可视化 安全 搜索推荐
探析低代码开发平台的核心能力
探析低代码开发平台的核心能力
428 0
|
API Python
Python库`openpyxl`是一个用于读取和写入Excel 2010 xlsx/xlsm/xltx/xltm文件的库。
【6月更文挑战第19天】`openpyxl`是Python处理xlsx文件的库,支持读写Excel 2010格式。使用`pip install openpyxl`安装。基本操作包括加载文件、读写单元格、操作行和列。例如,加载Excel后,可以读取单元格`A1`的值,或将“Hello, World!”写入`A1`。还可修改单元格内容,如加1后保存到新文件。更多功能,如样式和公式,见官方文档[1]。 [1]: <https://openpyxl.readthedocs.io/en/stable/>
395 1
|
开发框架 安全 .NET
使用grpcui测试gRPC服务
使用grpcui测试gRPC服务
383 0
|
存储 机器学习/深度学习 关系型数据库
mysql中char和varchar的区别
mysql中char和varchar的区别
473 1
|
机器学习/深度学习 算法 vr&ar
强化学习第二课【马尔科夫链】
强化学习第二课【马尔科夫链】
589 0
强化学习第二课【马尔科夫链】
|
安全 Java 编译器
[√]Android内存泄露排查
[√]Android内存泄露排查
268 0
|
Docker 容器
Harbor v2.3.2安装启动报错解决:Creating network “harbor_harbor“ with th..
Harbor v2.3.2安装启动报错解决:Creating network “harbor_harbor“ with th..
409 0
|
关系型数据库 MySQL 数据挖掘
聚焦数据总和:解析MySQL中的SUM()函数
在数据库管理中,计算数据总和是常见的数据分析任务,SUM()函数正是用于帮助我们实现这一目标的工具。
827 0