[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:案例演示**
**养猫案例:**
![](https://img.kancloud.cn/cf/32/cf32e0a66a2478078102c016d4579668_982x720.png)
<br>
<br>
### **1.2:结构体和结构体变量区别和联系**
通过:上面的案例和讲解我们可以看出:
1)结构体是自定义的数据类型,代表一类事物.
2)结构体变量(实例)是具体的, 实际的,代表一个具体变量
**注意:sum就是一个具体的实例**
<br>
<br>
### **1.3:结构体变量在内存中的布局**
![](https://img.kancloud.cn/2f/64/2f64a2c9a0a973a7e129373929285a65_1153x720.png)
<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一下)
初始值如下:
![](https://img.kancloud.cn/09/08/0908e2057d38c18645f120be8793e8ad_1238x720.png)
2)在创建一个结构体变量后,如果没有给字段赋值,都对应一个**零值**(默认值),规则同前面讲的一样: .
布尔类型是false,数值是0,字符串是""。
数组类型的默认值和它的元素类型相关,比如score \[3\]int则为\[0, 0, 0\]
**指针,slice, 和map的零值都是nil,即还没有分配空间。**
案例演示:
![](https://img.kancloud.cn/80/3f/803f16e98d2d26f40c7b6cde45e87fe9_761x720.png)
<br>
<br>
3)不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个。\[案例演示+图(Monster\]
![](https://img.kancloud.cn/c5/c6/c5c6b2c3848b0b431dd3bc855948fbd4_1032x720.png)
上面代码,内存示意图,下面的示意图是**值拷贝**
![](https://img.kancloud.cn/97/dd/97dd1c01916f18c7169eaa1c22d5b53a_1280x446.png)
<br>
<br>
### **1.7:创建结构体变量即使用访问字段**
1. 第一种方式在上面已经写过了
2. 第二种方式如下:
![](https://img.kancloud.cn/91/b8/91b882b47bddd821c619a2500b9aefba_1280x630.png)
<br>
3. 第三种方式3-&
var person \*Person = new (Person)
![](https://img.kancloud.cn/6a/44/6a443642a58e5f555ca2f45bc117a931_1280x645.png)
4. 第四种方式4-{}
var person \*Person = &Person\[\]
![](https://img.kancloud.cn/3f/69/3f69d390ffe8a87b90259ebf07a5a9fe_1220x720.png)
**说明:**
1)第3种和第4种方式返回的是结构体指针。
2)结构体指针访问字段的标准方式应该是: (\*结 构体指针).字段名,比如
(\*person).Name = "tom"
3)但go做了一个简化,也支持结构体指针.字段名,比如person.Name = "tom"。 更加符合程序员使用的习惯,go编译器底层对person.Name做了转化(\*person).Name
<br>
### **1.8:匿名结构体**
在定义一些临时数据结构等场景下还可以使用匿名结构体。
![](https://img.kancloud.cn/e0/a7/e0a7ac299168ed98ad083b86282648fa_1280x417.png)
<br>
### **1.9:结构体的细节**
1)结构体的所有字段是连续的
![](https://img.kancloud.cn/85/44/8544129e7204bb2ce305743fae3416e0_1280x630.png)
<br>
2)结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段名字、个数和类型)
![](https://img.kancloud.cn/05/e3/05e347d6071f94d54d9dede467cc582f_1205x720.png)
<br>
3)结构体进行type重新定义(相当于取别名)golang认为是新的数据类型,**但是互相可以强转**
![](https://img.kancloud.cn/21/5d/215d4e77eaad3e2527739bacb2e7100d_1280x622.png)
4)struct 的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化。
* 序列化应用场景
![](https://img.kancloud.cn/19/15/1915a9d0fc62b75c1865da7d61b9cc38_1280x320.png)
<br>
* 应用案例
![](https://img.kancloud.cn/ef/45/ef45872097f8cfc4feb19ab55534b1f4_1280x481.png)
- Golang语言之旅
- 第一章:初始小节以及安装
- 一:Golang语言特性
- 二:Windows上安装Go语言开发包
- 三:在Mac OS上安装Go语言开发包
- 第二章:GO语言注意事项
- 一:Dos的常用指令
- 第三章:Go初识小菜
- 一:Go语言之变量与常量
- 二:Go内置值-引用类型
- 三:基本的数据类型
- 四:字符串(char)
- 五:布尔类型(bool)
- 六:字符串类型(string)
- 七:基本数据类型的默认值
- 八:基本数据类型的互相转换
- 九:基本数据类型和string类型的相互转换
- 十:Golang指针
- 十一:值类型和引用类型
- 十二:标识符和命名规范
- 十三:系统保留关键字and预定义标识符
- 十四:fmt常用方法解析
- 第四章:Go运算符
- 一:运算符的基本介绍
- 二:算术运算符
- 2.1:算数运算符细节
- 三:关系运算符
- 3.1:关系运算符细节
- 四:逻辑运算符
- 4.1:逻辑运算符细节及案例
- 五:Go赋值运算符
- 5.1:案例演示赋值运算符的基本使用
- 5.2:赋值运算符的特点
- 六:Go位运算符
- 七:其他运算符
- 八:运算符的优先级
- 九:控制台输入语句
- 十:进制
- 十一:位运算
- 第五章:流程控制大纲
- 一:if语句
- 二:switch语句
- 三:for循环
- 第六章:函数-包-错误处理
- 一:Go函数
- 二:Go包
- 三:匿名函数
- 四:闭包
- 五:函数defer
- 六:函数参数的传递方式
- 七:变量的作用域
- 八:时间和日期相关函数
- 九:new和recover异常
- 十:数组(Array)切片(Section)
- 十一:切片(slice)
- 十二:3 数组的排序和查找
- 第七章:Map
- 第一节:Map基础认识
- 第二节:Map初始化和make
- 第三节:Map增删改查
- 第四节:Map的切片
- 第五节:Map的注意事项
- 第八章:面向对象(上)
- 第一节:结构体(值类型)
- 第二节:方法
- 第三节:面向对象编程应用实例
- 第九章:面向对象(下)
- 第一节:面向对象之抽象
- 第二节:面向对象之继承
- 第三节:面向对象之多态
- 第四节:接口
- 第十章:文件操作
- 第一节:文件基本介绍
- 第二季:写文件实例操作
- 第三节:JSON
- 第十一章:单元测试
- 第一节:单元测试介绍
- 第二节:单元测试案例
- 第三节:单元测试总结
- 第四节:单元测试案例
- 第十二章:goroutine和channel
- 第一节:goroutine基本介绍
- 第二节:goroutine入门案例
- 第三节:goroutione调度模型
- 第四节:Golang设置运行的CPU数量
- 第十二章:channel
- 第一节:channel基本介绍
- 第二节:channel基本使用
- 第三节:channel案例演示
- 第四节:channel 使用的注意事项
- 第五节:channel练习题
- 第六节:channel的遍历和关闭
- 第七节:goroutione和channel结合
- 第八节:channel细节处理
- 第十二章:并发模式
- 第十三章:反射reflect
- 第一节:反射基本介绍
- 第二节:反射重要的函数和概念
- 第三节:反射快速入门案例
- 第四节:反射注意事项
- 第五节:反射练习题
- 第六节:反射最佳实践