开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:Go 面向对象编程快速入门】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9667
Go 面向对象编程快速入门
内容介绍:
一、结构体与结构体变量的关系
二、Go 面向对象编程快速入门
前面我们已经学习了 Golang 语言面向对象编程的特点,并简单认识了结构体,本节课要学习的内容是结构体究竟是什么?其与结构体变量(实例/对象)的关系是什么?
一、结构体与结构体变量的关系
结构体变量也可以称为实例或对象,再以养猫的故事为例,来理解结构体与结构体变量(实例/对象)的关系。
猫的品种有很多,但不同品种的猫总会有相同的属性,或称字段,如名字(Name)、年龄(Age)、颜色(Color)等;此外,它们可能还有相同的行为(方法),如它们都会叫、睡觉、进食、做算数题等,此时就可以将这些猫绑定一些行为方法。将所有猫的特征提取出来放到一个数据类型中,这个数据类型就叫结构体,即 Cat 结构体。然后,根据 Cat 结构体数据类型,可以创建多个实例或变量。也就是说,通过提取事物相同的特征和行为可以形成一种数据类型,即结构体,通过该数据类型可以创建多种变量/实例。如 int 是一种数据类型,它可以包括多个变量,可以定义多个 int 类型的变量 a,b,...,而 Cat 结构体也是一种数据类型,故也可以创建多个 Cat 的变量,如“小黄猫”“小白猫”“小花猫”等。换言之,结构体与结构体变量(实例/对象)的关系可以概括为:通过提取事物共同的字段及方法,可以形成一个数据类型,即结构体,通过这种数据类型可以创建多个变量/实例。其示意图如下:
总结:
①将一类事物的特征提取出来(如猫类),形成一个新的数据类型,这个数据类型就是一个结构体。
②通过这个结构体我们可以创建多个变量(实例/对象)。
③此处的事物可以一切事物,如 Person、Fish、或工具类,等。从猫结构体到变量,就是创建一个 Cat 结构体变量,也可以说是定义一个结构体变量,具体的事物种类要依编程需求不同来确定。
二、Go面向对象编程快速入门
1.利用结构体(struct)以面向对性的方式解决养猫问题
张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。另一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫猫。
代码演示:
package main
import (
"fmt"
)
//定义一个 Cat 结构体的各个字段/属性,放入到 Cat 结构体进行管
理,与先前的单独定义变量、数组等方式分散管理各个属性不同,结
构体可将各个属性统一管理和维护
type Cat struct {
Name string
Age int
Color int
////猫的名字、年龄和颜色是猫的字段,且各字段名称的首字母大写,说明该字段支持公开使用
}
func main() {
//创建一个Cat变量
var cat1 Cat
//类似于 var a int,是指 cat1的数据类型是 Cat,当然 int 也可以绑定方法,后面会学到;当定义了 cat1之后,该猫的字段(属于值类型)就已经分配了,若输入 fmt.Println("cat1=",cat1)。则输出结果为 cat1= < 0 >,虽然该处仅显示一个“0”,但其确实包括了 cat1的三个属性,名字一个默认值,显示为一个空的字符串"",0代表年龄,颜色也显示为一个空的字符串"",也就是说该输出结果是由于没有为字段赋值而导致的。
cat1.Name = "小白"
cat1.Age = 3
cat1.Color = "白色"
//变量赋值方式:变量名称.字段名= ...
//此时输入 fmt.Println("cat1=",cat1),输出结果显示为 cat1= <小白 3 白色>,包含了3个字段。使用结构体管理数据十分便捷,若要获得某只猫的数据信息,只要输入其结构体的名称,其他信息即可通过字段名访问。
fmt.Println("猫猫的信息如下:")
fmt.Println("name=",cat1.Name)
fmt.Println("age=",cat1.Age)
fmt.Println("color=",cat1.Color)
}
输出结果:
猫猫的信息如下:
name= 小白
age= 3
color= 白色
进而我们可以发现通过一个结构体可以将一只猫的所有字段都进行统一管理。
2. 假设要再增加一个字段,如猫的爱好“hobby”
代码演示:
package main
import (
"fmt"
)
type Cat struct {
Name string
Age int
Color int
Hobby string
}
func main() {
var cat1 Cat
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)
}
输出结果:
猫猫的信息如下:
name= 小白
age= 3
color= 白色
hobby= 吃<・)))><<
可发现面向对象编程利用结构体 struct 可轻松实现对属性/字段的管理。该种方法可以对结构体“Cat”绑定方法,如“小猫通过学习可以做算术题”;此外,该种方法还可以对其属性绑定方法,后面会陆续讲到。总之,利用结构体 struct 面向对象编程对管理属性较多的物体,对编程来说十分有利。
结构体 struct 面向对象编程方式的核心代码主要包括以下两部分:
(1)定义结构体(即定义结构体及其包含的物体的属性)
type Cat struct {
Name string
Age int
Color int
Hobby string
}
(2)调用结构体
var cat1 Cat
cat1.Name = "小白"
cat1.Age = 3
cat1.Color = "白色"
fmt.Println("猫猫的信息如下:")
fmt.Println("name=",cat1.Name)
fmt.Println("age=",cat1.Age)
fmt.Println("color=",cat1.Color)
通过本节课,我们可以体会到结构体 struct 的便捷之处,其解决了 bool 管理和 bool 维护问题,还可以为之绑定方法,对编程而言十分有利。