Go語言文件操作、json序列化、單元測試
Go語言文件操作、json序列化、單元測試
os.File封裝所有文件相關(guān)操作,File是一個結(jié)構(gòu)體。
打開文件:func Open(name string)(file *File, err error)
關(guān)閉文件:func (f*File) Close() error
讀取文件:
①讀取的內(nèi)容并顯示在終端(帶緩沖區(qū)),使用os.Open,file.Close,bufio.NewReader(), reader.ReadString函數(shù)和方法。

②讀取文件的內(nèi)容并顯示在終端(使用ioutil.ReadFile一次將整個文件讀入到內(nèi)存中),這種方式適用于文件不大的情況。文件的open和close被封裝到ReadFile函數(shù)內(nèi)部。

?寫文件:
func OpenFil(name string, flag int, perm FileMode (file *File, err error)
flag int:文件打開模式(可組合);perm FileMode:權(quán)限控制:r→4;w→2;x→1。
?
實例1:①創(chuàng)建一個新文件。

②將原來的內(nèi)容覆蓋成新的內(nèi)容10句"你好,尚硅谷!"。

③打開一個存在的文件,在原來的內(nèi)容追加內(nèi)容 'ABC! ENGLISH!'

④打開一個存在的文件,將原來的內(nèi)容讀出顯示在終端,寫入內(nèi)容5句"hello,尚硅谷"。

?
實例2:編程一個程序,將一個文件的內(nèi)容,寫入到另外一個文件。注:文件已存在。
說明:使用ioutil.ReadFile / ioutil. WriteFile完成寫文件的任務(wù)。

?
判斷文件是否存在:
使用os.Stat()函數(shù)返回的錯誤值進行判斷:
如果返回的錯誤為nil:說明文件或文件夾存在。
如果返回的錯誤類型使用os.lsNotExist()判斷為true,說明文件或文件夾不存在。
如果返回的錯誤為其它類型,則不確定是否在存在。
統(tǒng)計英語、數(shù)字、空格、其他字符的數(shù)量


拷貝文件:func Copy(dst Writer, src Reader)(written int64, err error) 【io包】

?
命令行參數(shù):os.Amgs,是一個string的切片,用來存儲所有的命令行參數(shù)。

go設(shè)計者給我們提供了flag包,可以方便的解析命令行參數(shù),而且參數(shù)順序可以隨意。

?
?
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式。key-val
JSON易于機器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率,通常程序在網(wǎng)絡(luò)傳輸時會先將數(shù)據(jù)(結(jié)構(gòu)體、map等)序列化成json字符串,到接收方得到j(luò)son字符串時,在反序列化恢復(fù)成原來的數(shù)據(jù)類型(結(jié)構(gòu)體、map等)。這種方式已然成為各個語言的標準。
Golang →(序列化)→ json字符串 →(網(wǎng)絡(luò)傳輸)→ 程序 →(反序列化)→ 其他語言
在JS語言中,一切都是對象。因此,任何的數(shù)據(jù)類型都可以通過JSON來表示。
JSON鍵值對是用來保存數(shù)據(jù)一種方式,鍵/值對組合中的鍵名寫在前面并用雙引號""包裹,使用冒號:分隔,然后緊接著值。
json數(shù)據(jù)在線解析:https://www.json.cn/




對于結(jié)構(gòu)體的序列化,如果我們希望序列化后的key的名字,又我們自己重新制定,那么可以給struct指定一個tag標簽。
序列化后:{ "monster_name":"牛魔王","monster_age":500,"Birthday":"2011-11-11".
"Sal":8000,"Skill :"牛魔拳"}
?
Json的反序列化
①確保反序列化后的數(shù)據(jù)類型和原來序列化前的數(shù)據(jù)類型一致。
②如果json字符串是通過程序獲取到的,則不需要再對“轉(zhuǎn)義處理。



?單元測試
Go語言中自帶有一個輕量級的測試框架testing和自帶的go test命令來實現(xiàn)單元測試和性能測試,testing框架和其他語言中的測試框架類似,可以基于這個框架寫針對相應(yīng)函數(shù)的測試用例,也可以基于該框架寫相應(yīng)的壓力測試用例。
①測試用例文件名必須以_test.go 結(jié)尾。比如cal_test.go,cal不是固定的。
②測試用例函數(shù)必須以Test開頭,一般來說就是Test+被測試的函數(shù)名。
③TestAddUpper(t *tesing.T) 的形參類型必須是*testing.T。
④一個測試用例文件中,可以有多個測試用例函數(shù)。
⑤運行測試用例指令
cmd>go test[如果運行正確,無日志,錯誤時,會輸出日志]
? cmd>go test-v[運行正確或是錯誤,都輸出日志]
⑥當(dāng)出現(xiàn)錯誤時,可以使用t.Fatalf來格式化輸出錯誤信息,并退出程序。
⑦t.Logf方法可以輸出相應(yīng)的日志。
⑧測試用例函數(shù),并沒有放在 main函數(shù)中,也執(zhí)行了,這就是測試用例的方便之處。
⑨PASS表示測試用例運行成功,F(xiàn)AL表示測試用例運行失敗。
⑩測試單個文件,一定要帶上被測試的原文件:go test -v cal_test.go??cal.go
①測試單個方法:go test -v -test.run TestAddUpper
?
案例:
①編寫一個Monster結(jié)構(gòu)體,字段Name, Age, Skill
②給Monster綁定方法Store,可以將一個Monster變量(對象),序列化后保存到文件中。
③給Monster綁定方法ReStore,可以將一個序列化的Monster,從文件中讀取,并反序列化為Monster對象,檢查反序列化,名字正確。
④編程測試用例文件store_test.go,編寫測試用例函數(shù)TestStore和TestRestore進行測試。
monster.go:


monster_test.go:


?
?