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...