golang面向对象编程:结构体详解

看一个问题

在这里插入图片描述

使用现有技术解决

  1. 单独的定义变量解决
    代码演示:
    在这里插入图片描述
  2. 使用数组解决
    代码演示:
    在这里插入图片描述

现有技术解决的缺点分析

  1. 使用变量或者数组来解决养猫的问题,不利于数据的管理和维护。因为名字,年龄,颜色都是
    属于一只猫,但是这里是分开保存。
  2. 如果我们希望对一只猫的属性(名字、年龄,颜色)进行操作(绑定方法), 也不好处理。
  3. 引出我们要讲解的技术-》结构体。

一个程序就是一个世界,有很多对象(变量)

在这里插入图片描述

Golang 语言面向对象编程说明

  1. Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。
  2. Golang 没有类(class),Go 语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解 Golang 是基于 struct 来实现 OOP 特性的。
  3. Golang 面向对象编程非常简洁,去掉了传统 OOP 语言的继承、方法重载、构造函数和析构函数、隐藏的 this 指针等等。
  4. Golang 仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它 OOP 语言不一样,比如继承 :Golang 没有 extends 关键字,继承是通过匿名字段来实现。
  5. Golang 面向对象(OOP)很优雅,OOP 本身就是语言类型系统(type system)的一部分,通过接口(interface)关联,耦合性低,也非常灵活。后面同学们会充分体会到这个特点。也就是说在 Golang 中面向接口编程是非常重要的特性。

结构体与结构体变量(实例/对象)的关系示意图

在这里插入图片描述

  • 对上图的说明
  1. 将一类事物的特性提取出来(比如猫类), 形成一个新的数据类型, 就是一个结构体。
  2. 通过这个结构体,我们可以创建多个变量(实例/对象)。
  3. 事物可以猫类,也可以是 Person , Fish 或是某个工具类。

在这里插入图片描述

快速入门-面向对象的方式(struct)解决养猫问题

  • 代码演示

在这里插入图片描述
在这里插入图片描述

结构体和结构体变量(实例)的区别和联系

通过上面的案例和讲解我们可以看出:

  1. 结构体是自定义的数据类型,代表一类事物.
  2. 结构体变量(实例)是具体的,实际的,代表一个具体变量

结构体变量(实例)在内存的布局(重要!)

在这里插入图片描述

如何声明结构体

  • 基本语法
type 结构体名称 struct {
	field1 type
	field2 type
}
  • 举例:
type Student struct {
	Name string //字段
	Age int //字段
	Score float32
}

字段/属性

  • 基本介绍
  1. 从概念或叫法上看: 结构体字段 = 属性 = field (即授课中,统一叫字段)
  2. 字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。比如我们前面定义猫结构体 的 Name string 就是属性
  • 注意事项和细节说明
  1. 字段声明语法同变量,示例:字段名 字段类型
  2. 字段的类型可以为:基本类型、数组或引用类型
  3. 在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值),规则同前面讲的一样:
    布尔类型是 false ,数值是 0 ,字符串是 “”。
    数组类型的默认值和它的元素类型相关,比如 score [3]int 则为[0, 0, 0]
    指针,slice,和 map 的零值都是 nil ,即还没有分配空间。

案例演示:

在这里插入图片描述
在这里插入图片描述
4) 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个, 结构体是值类型。
案例:

在这里插入图片描述
在这里插入图片描述
画出上面代码的内存示意图:

在这里插入图片描述

创建结构体变量和访问结构体字段

  • 方式 1-直接声明
    案例演示:
 var person Person

前面我们已经说了。

  • 方式 2-{}
    案例演示:
var person Person = Person{}

在这里插入图片描述

  • 方式 3-&
    案例:
var person *Person = new (Person)

在这里插入图片描述

  • 方式 4-{}
    案例:
var person *Person = &Person{}

在这里插入图片描述

  • 说明:
  1. 第 3 种和第 4 种方式返回的是 结构体指针。
  2. 结构体指针访问字段的标准方式应该是:(*结构体指针).字段名 ,比如
(*person).Name = "tom"
  1. 但 go 做了一个简化,也支持 结构体指针.字段名,
    比如 person.Name = “tom”。更加符合程序员
    使用的习惯,go 编译器底层 对 person.Name 做了转化 (*person).Name。

struct 类型的内存分配机制

  • 看一个思考题
    在这里插入图片描述

输出的结果是: p2.Name = tom p1.Name = 小明

  • 基本说明
    在这里插入图片描述
  • 结构体在内存中示意图
    在这里插入图片描述
  • 看下面代码,并分析原因
    在这里插入图片描述
    输出的结果是:
    在这里插入图片描述
    上面代码对应的内存图的分析:
    在这里插入图片描述
  • 看下面代码,并分析原因

在这里插入图片描述

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

  1. 结构体的所有字段在内存中是连续的
    在这里插入图片描述
    在这里插入图片描述
    对应的分析图:
    在这里插入图片描述
  2. 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)
    在这里插入图片描述
  3. 结构体进行 type 重新定义(相当于取别名),Golang 认为是新的数据类型,但是相互间可以强转
    在这里插入图片描述
  4. struct 的每个字段上,可以写上一个 tag, 该 tag 可以通过反射机制获取,常见的使用场景就是序列化和反序列化。
  • 序列化的使用场景:
    在这里插入图片描述
  • 举例:
    在这里插入图片描述
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值