[TOC]
<br>
<br>
>[success] ## **1:寫文件實例操作**
### **1:基本介紹**
```
func OpenFile(name [string](string), flag [int](int), perm [FileMode](FileMode) (file *[File](File), err [error](error))
```
**說明**: os.OpenFile是\-一個更一般性的文件打開函數,它會使用指定的選項(如
O_RDONLY等) 、指定的模式(如0666等)打開指定名稱的文件。如果操作成功,返
回的文件對象可用于I/0。如果出錯,錯誤底層類型是\*PathError.
<br>
**OpenFile參數說明:**
1,name ? string:要打開的文件路徑
2,flag ??? int :文件的打開模式(可以組合)
3,perm FileMode:文件是什么權限控制的
<br>
**第二個參數**:文件打開模式;如下
const (
????O\_RDONLY int = syscall.O\_RDONLY // 只讀模式打開文件
????O\_WRONLY int = syscall.O\_WRONLY // 只寫模式打開文件
????O\_RDWR ??int = syscall.O\_RDWR ??// 讀寫模式打開文件
????O\_APPEND int = syscall.O\_APPEND // 寫操作時將數據附加到文件尾部
????O\_CREATE int = syscall.O\_CREAT ?// 如果不存在將創建一個新文件
????O\_EXCL ??int = syscall.O\_EXCL ??// 和O\_CREATE配合使用,文件必須不存在
????O\_SYNC ??int = syscall.O\_SYNC ??// 打開文件用于同步I/O
????O\_TRUNC ?int = syscall.O\_TRUNC ?// 如果可能,打開時清空文件
)
**第三個參數**:打開文件權限
注意:FileMode在windows下是不管用,只有在liunx或unix下面才管用

<br>
<br>
>[success] ## **2:寫文件方式一**
1)**創建一個新文件,寫入內容5句**"hello, Gardon"

<br>
2)打開一個存在的文件中,**將原來的內容覆蓋成新的內容**10句"jeson 要挺住!"

<br>
3)打開一個存在的文件,在原來的內容**追加內容**'ABC! ENGLISH!' 例如日志

<br>
4)打開一個存在的文件,將原來的內容讀出顯示在終端,并且追加3句話"

使用os.OpenFile(), bufio.NewWriter(), \*Writer的方法WriteString完成上面的任務,**帶緩沖方法**
<br>
<br>
>[success] ## **3:寫文件方式二**
案例如下:
編程一個程序,將一個文件的內容,寫入到另外一個文件。注:這兩個文件已經存在了
>:將src/Go\_project/Open/bufiotest文件中的內容寫入
src/Go\_project/Open/bufiotest2
說明:
1)使用ioutil.ReadFile / ioutil.WriteFile完成寫文件的任務.

<br>
<br>
>[success] ## **4:判斷文件是否存在**
golang判斷文件或文件夾是否存在的方法為使用**os.Stat()**函數返回的錯誤值進行判斷:
1)如果返回的錯誤為nil,說明文件或文件夾存在
2)如果返回的錯誤類型使用**os.IsNotExist()**判斷為true,說明文件或文件夾不存在
3)如果返回的錯誤為其它類型,則不確定是否在存在


<br>
<br>
>[success] ## **5:文件拷貝**

**注意:** copy函數是io包實現的

<br>
<br>
>[success] ## **6:文件統計**
說明:統計一個文件中含有的英文、數字、空格及其它字符數量。


<br>
<br>
>[success] ## **7:flag命令解析**
### **1:基本介紹**
```
[func StringVar(p *string, name string, value string, usage string)](StringVar)
```



主要是來獲取終端的參數命令,例如mysql的登錄 mysql -u root -p 3306 -h127.0.0.1
flag包就是來獲取\-u 和 \-p -h后面的參數,而且使用flag包,不需要按照固定死的寫法來寫,我們可以將key value的前后順序打亂,例如:mysql -p 3306 -u root ........
### **2:案例演示**

命令行參數使用提示:

<br>
<br>
>[success] ## 8:json(JavaScript Object Notation)
### **1:json基本介紹**
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。易于人閱讀和編寫。同時也易于機器解析和生成。key-val
JSON是在2001年開始推廣使用的數據格式,目前已經成為主流的數據格式。
JSON易于機器解析和生成,并有效地提升**網絡傳輸效率**,通常程序在網絡傳輸時會先將**數據(結構體、map等)序列化成json字符串到接收方得到json字符串時,在反序列化恢復成原來的數據類型(結構體、map等)** 這種方式已然成為各個語言的標準。

### **2:json數據格式**
在JS語言中,一切都是對象。因此,任何支持的類型都可以通過JSON來表示,例如字符串、數字、對象、數組等.
JSON鍵值對是用來保存數據一種方式,
鍵/值對組合中的鍵名寫在前面并用雙引號""包裹,使用冒號:分隔,然后緊接著值:
```
{
????"code":1,
????"msg":"success",
????"data":{
????????"name":"pig",
????????"age":"18",
????????"sex":"man",
????????"hometown":{
????????????"province":"江西省",
????????????"city":"撫州市",
????????????"county":"崇仁縣"
????????}
????}
}
```
### **3:Marshal()與unmarshal**
Json Marshal:將數據編碼成json字符串(序列化)
Json Unmarshal:將json字符串解碼到相應的數據結構(反序列化)
**應用實例如下**:



<br>
<br>
### **4:使用json tag指定字段名**
序列化與反序列化默認情況下使用結構體的字段名,我們可以通過給結構體字段添加tag來指定json序列化生成的字段名
案例如下:

### **5:json的序列化**
json序列化是指,將有**key-value**?結構的數據類型(比如結構體、map、切片)序列化成json字符串
這里我們介紹一下**結構**體,**map**和**切片**的序列化
**序列化方法:官網解釋如下:**
**func?[Marshal]**
**func Marshal(v interface{}) (\[\]byte, error)**
Marshal函數返回v的json編碼。
Marshal函數會遞歸的處理值。如果一個值實現了Marshaler接口切非nil指針,會調用其MarshalJSON方法來生成json編碼。nil指針異常并不是嚴格必需的,但會模擬與UnmarshalJSON的行為類似的必需的異常。
否則,Marshal函數使用下面的基于類型的默認編碼格式:
布爾類型編碼為json布爾類型。
浮點數、整數和Number類型的值編碼為json數字類型。
字符串編碼為json字符串。角括號""會轉義為"\\u003c"和"\\u003e"以避免某些瀏覽器吧json輸出錯誤理解為HTML。基于同樣的原因,"&"轉義為"\\u0026"。
數組和切片類型的值編碼為json數組,但\[\]byte編碼為base64編碼字符串,nil切片編碼為null。
結構體的值編碼為json對象。每一個導出字段變成該對象的一個成員。
* [ ] 自己解釋:Marshal方法接受一個interface,而我們在學方法時曾說過,接受類型是**interface可以接受任何數據類型**,Marshal方法返回兩個參數,**一個byte切片,一個error報錯**
* [ ] **注意:Marshal內部會做一個判斷,如果該v中的字段可以用則序列化,不可以用(例如小寫)則不取出--------Marshal內部有反射機制**
**5.1:結構體序列化:**

**5.2:map序列化**

**5.3:Slice序列化**

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