开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程:struct 内存布局】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9668
struct 内存布局
内容介绍:
一、结构体与结构体变量的区别与联系
二、结构体变量的内存布局
一、结构体与结构体变量的区别与联系
通过上节课的案例和讲解,可以发现结构体与结构体变量之间存在着某些相同点与不同点,如下:
1.区别
(1)结构体是一种自定义的数据类型,这是其本质,其代表一类事物。如 type Cat struct 则定义了一个结构体 Cat,这里的结构体代表“猫”这种事物
(2)结构体变量(实例)是具体的、实际的,代表一个具体变量。如 var cat1 Cat 则是定义了一个实际存在的结构体变量 cat1
2. 联系
该部分内容在上节课“Go 面向对象编程快速入门”中“结构体与结构体变量关系示意图中”有作讲解。
二、结构体变量的内存布局(重点)
package main
import (
"fmt"
)
type Cat struct {
Name string
Age int
Color int
Hobby string
}
func main() {
var cat1 Cat
fmt.printf("cat1的地址=%p\n",&cat1)
cat1.Name = "小白"
cat1.Age = 3
cat1.Color = "白色"
cat1.Hobby = "吃<・)))><<"
fmt.Println("猫猫的信息如下:")
fmt.Println("name=",cat1.Name)
fmt.Println("age=",cat1.Age)
fmt.Println("color=",cat1.Color)
fmt.Println("hobby=",cat1.Hobby)
}
输出结果:
cat1的地址=0xc0420340c0
猫猫的信息如下:
name= 小白
age= 3
color= 白色
hobby= 吃<・)))><<
结构体 Cat 中创建的结构体变量 cat1在内存中的示意图如下:
(1)当代码执行“var cat1 Cat”结束时,结构体变量在内存中的存在形式与结构体本身的定义(即数据类型)密切相关。cat1变量直接指向了结构体 Cat,且结构体Cat结构体中有分为四部分,每部分各自对应“Name”“Age”“Color”“Hobby”4个字段,由于未赋值,故string类型的变量“Name”“Color”“Hobby”显示为空字符串"",int 型变量“Age”显示为默认值“0”。该过程中,cat1变量直接指向结构体的数据空间,而并没有先经过地址空间,再指向结构体,说明在 Go 语言面向对象编程中,结构体是值类型,而不是引用类型,但在其他的很多编程语言中,结构体不一定是值类型。
(2)当代码执行“cat1.Name = "小白"”时,可通过 cat1访问至 Cat 结构体中 Name 字段,记录值由空字符串""变为“小白”(①);同理,当代码执行“cat1.Age = "3"”时,可通过cat1访问至 Cat 结构体中 Age 字段,记录值由默认值“0”变为“3”4(②);当代码执行“cat1.Color = "白色"”时,可通过 cat1访问至 Cat 结构体中 Color 字段,记录值由空字符串""变为“白色”(③);当代码执行“cat1.Hobby = "吃<・)))><<"”时,可通过 cat1访问至 Cat 结构体中 Hobby 字段,记录值由空字符串""变为“吃<・)))><<”(④)。示意图如下:
总结:
1)当声明一个结构体变量时,其数据空间即存在,在对变量赋值前,其各个属性的默认值也已存在;
2)结构体变量/结构体是值类型。