JSON XML GOB操作 GO高階程式設計

2021-09-26 23:01:26 字數 1927 閱讀 9839

json作為乙個被廣泛使用的輕量級,占用少量記憶體和頻寬的資料結構傳輸協議,常被用於web後端與瀏覽器的之間的互動,當然在其他場景也適用

encoding/json包

// 格式化值為json,json format

json.marshal(value)

// 使用乙個encoder

enc := json.newencoder(file) //encoder型別的指標可呼叫方法 encode(v inte***ce{})

err := enc.encode(vc)

會將資料物件vc的json編碼寫入io.writer型別的file中

出於安全的考慮,在web應用中最好使用json.marshalforhtml()函式,其對資料執行html轉碼,所以文字可以被安全地巢狀在html

json與go型別對應如下:

bool對應json的boolean

float64對應json的number

string對應json的string

nil對應json的null

不是所有的資料都可以編碼為json型別,只有通過驗證的資料結構才能被編碼:

json物件只支援字串型別的key,要編碼乙個go map型別,map必須是map[string]t,t是json包中支援的任何型別

channel ,複雜資料型別和函式型別不能被編碼

不支援迴圈資料結構;它將引起序列化進入乙個無限迴圈

指標可以被編碼,實際上是對指標指向的值進行編碼(或者指標是nil)

反序列化

解碼過後的,將資料儲存在相應的結構中,反射能夠將json欄位去嘗試匹配目標結構字段,但只有真正匹配上的字段才會填充資料,字段沒有匹配不會報錯,而是直接忽略掉

處理未知的 json 資料,可以確保型別安全

b := byte(``)

var f inte***ce{}

err := json.unmarshal(b, &f)

m := f.(map[string]inte***ce{})

for k, v := range m :

fmt.println(k, "is an array:")

for i, u := range vv

default:

fmt.println(k, "is of a type i don』t know how to handle")

}}

解碼資料到結構

如果我們事先知道 json 資料,我們可以定義乙個適當的結構並對 json 資料反序列化

type familymember struct

var m familymember

err := json.unmarshal(b, &m)

實際上是分配了乙個新的切片,這是乙個典型的反序列化應用型別

編碼和解碼流

json包提供了decoder和encoder型別來支援常用的json資料流讀寫

newdecoder和newencoder分別封裝了io.reader和io.writer介面

在go中到處都實現了reader和writer,因此encoder和decoder可被應用的場景很廣,

例如讀取或寫入http連線,websockets或檔案。

encoding/xml包

和json操作類似

go自己的以二進位制序列化和反序列化程式資料的格式

用途:常用於遠端方法呼叫(rpcs)引數和結果的輸出,以及應用程式和機器之間的資料傳輸

於xml和json的區別:

特定用於純go的環境,例如兩個用go寫的服務之間的通訊,程式可以被實現的更加高效和優化,不是可以外部定義與語言無關的編碼方式,它的首選格式是二進位制,而不是像json和xml的純文字格式,gob並不是一種不同於go的語言,而是在編碼和解碼過程中用到了go的反射。

go語言高併發channel詳解

go語言中channel可以理解是乙個先進先出的佇列,通過管道進行通訊。csp 模型 傳統的併發模型主要分為 actor 模型和 csp 模型,csp 模型全稱為 communicating sequential processes,csp 模型由併發執行實體 程序,執行緒或協程 和訊息通道組成,實...

go檔案操作

go語言支援的檔案操作很多 1 傳統的檔案操作 匯入檔案操作需要的包 import os f os.open filepath f.read byte f.close 這裡寫 片openfile,err os.open test.go 正確開啟檔案返回err nil 這裡如果檔案開啟異常,則丟擲錯誤...

go 常用操作

func struct2map obj inte ce map string inte ce for i 0 i t.numfield i return data 注意 如果報錯 handler crashed with error reflect numfield of non struct ty...