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

<br>
<br>
### **1.2:结构体和结构体变量区别和联系**
通过:上面的案例和讲解我们可以看出:
1)结构体是自定义的数据类型,代表一类事物.
2)结构体变量(实例)是具体的, 实际的,代表一个具体变量
**注意:sum就是一个具体的实例**
<br>
<br>
### **1.3:结构体变量在内存中的布局**

<br>
<br>
### **1.4:结构体声明**
```
type Cat struct{
Name string
Age int
Color string
}
```
注意:**type和struct是关键字,Cat是结构体名称(也叫结构体变量),如果结构体的名称大写那么可以在其他包中使用,结构体里面的部分 Name 是(字段)变量名 string是变量名的类型,如果变量名大写,也可以在其他程序或包中使用**
<br>
<br>
### **1.5:字段/属性**
基本介绍
1)从概念或叫法上看结构体字段\=属性\=field (即授课中, 统一叫字段)案例演示
2)字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型。比如我们前面定义猫结构体的Name string就是属性
<br>
<br>
### **1.6:字段/属性注意事项**
1)如果结构体里面的也可以是,**指针**,**slice**,和map都是零值都是nil,即还没分配空间(需要make一下)
初始值如下:

2)在创建一个结构体变量后,如果没有给字段赋值,都对应一个**零值**(默认值),规则同前面讲的一样: .
布尔类型是false,数值是0,字符串是""。
数组类型的默认值和它的元素类型相关,比如score \[3\]int则为\[0, 0, 0\]
**指针,slice, 和map的零值都是nil,即还没有分配空间。**
案例演示:

<br>
<br>
3)不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个。\[案例演示+图(Monster\]

上面代码,内存示意图,下面的示意图是**值拷贝**

<br>
<br>
### **1.7:创建结构体变量即使用访问字段**
1. 第一种方式在上面已经写过了
2. 第二种方式如下:

<br>
3. 第三种方式3-&
var person \*Person = new (Person)

4. 第四种方式4-{}
var person \*Person = &Person\[\]

**说明:**
1)第3种和第4种方式返回的是结构体指针。
2)结构体指针访问字段的标准方式应该是: (\*结 构体指针).字段名,比如
(\*person).Name = "tom"
3)但go做了一个简化,也支持结构体指针.字段名,比如person.Name = "tom"。 更加符合程序员使用的习惯,go编译器底层对person.Name做了转化(\*person).Name
<br>
### **1.8:匿名结构体**
在定义一些临时数据结构等场景下还可以使用匿名结构体。

<br>
### **1.9:结构体的细节**
1)结构体的所有字段是连续的

<br>
2)结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段名字、个数和类型)

<br>
3)结构体进行type重新定义(相当于取别名)golang认为是新的数据类型,**但是互相可以强转**

4)struct 的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化。
* 序列化应用场景

<br>
* 应用案例
