[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>
* 應用案例

- 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
- 第一節:反射基本介紹
- 第二節:反射重要的函數和概念
- 第三節:反射快速入門案例
- 第四節:反射注意事項
- 第五節:反射練習題
- 第六節:反射最佳實踐