Let s Go Go語言開發之旅 五

2021-10-25 06:59:50 字數 3158 閱讀 6109

基本規則

核心功能

單元測試

參考資料

將乙個物件寫成特定文字格式的字元流,稱為序列化。

json簡單的理解就是特殊格式的字串,被設計用來傳輸和儲存資料,和xml類似,但是在api和前後端分離資料互動更多是使用json,json不僅比xml簡單,傳輸中更節省文字。**中的ajax、後端api基本上是使用json編碼後的資料。

參考官方 encoding/json 包 marshal 函式,將結構資料格式化為 json 字元流

首先需要設定讀取後輸出的json格式

const

( jsontag =

"json"

jsonstart =

"" arraystart =

"[" arrayend =

"]" stringstartend =

`"` stringstartendscaped =

`` is =

`:` comma =

"," null =

"null"

empty =

" " booleantrue =

"true"

booleanfalse =

"false"

)

將從結構體讀取的結果儲存到marshal結構體中

type marshal struct

result *bytes.buffer

tags [

]string

}

通過下列函式完成json物件序列化的功能

func

(m *marshal)

getvalue

(value reflect.value)

(reflect.value, reflect.type,

error

)func

(m *marshal)

do(object reflect.value)

error

func

(m *marshal)

handlekey

(key reflect.value)

error

func

(m *marshal)

handlevalue

(object reflect.value)

error

func

(m *marshal)

handlemarshaljson

(object reflect.value)

(bool,[

]byte

,error

)func

(m *marshal)

loadtag

(typ reflect.structfield)

(exists bool

, tag string

, err error

)func

(m *marshal)

encodestring

(str string

)string

最後匯出jsonmarshal介面

func

(m *marshal)

execute()

([]byte

,error

)func

jsonmarshal

(object inte***ce

, tags ...

string)(

byte

,error

)

為了驗證jsonmarshal json物件序列化的準確性,我們設定了兩個單元測試

func

testmarshal1

(t *testing.t)

},"numbers":[1,2,3],"others":},"c":}},"addresses":[},}]}`

addr :=

&address,}

example := person

, others:

map[

string

]*address

, addresses:

*address,}

// with tags "db" and "db.write"

// marshal

bytes, err :=

jsonmarshal

(example,

"db"

,"db.write"

)if err !=

nil res :=

string

(bytes)

if res != expected

}

func

testmarshal2

(t *testing.t)

},"numbers":[1,2,3],"others":},"c":}},"addresses":[},}]}`

addr :=

&address,}

example := person

, others:

map[

string

]*address

, addresses:

*address,}

// with tags "db" and "db.read"

// marshal

bytes2, err :=

jsonmarshal

(example,

"db"

,"db.read"

)if err !=

nil res :=

string

(bytes2)

if res != expected

}

執行測試結果如下

程式包開發-json格式序列化

encoding/json

Go語言的學習之旅 五

func main 陣列 printslice s fmt.println s 0 2 使用切片方式 fmt.println s 2 fmt.println s 0 fmt.println s s2 make int,3,5 通過make int,len,cap 來定義切片 printslice s...

Android socket 開發之旅

這段時間以來,由於乙個專案,輾轉於android的socket 程式設計,倍加煩惱。特編寫寫此文以記.1 socket原理 2 兩種連線方式的區別 3 tcp簡單socket通訊 4 與gps伺服器的socket通訊 2 android socket程式設計分為tcp與udp兩種建立連線的方式。一 ...

Android Kotlin 開發之旅

kotlin語言推出已經兩年之久了,作為一種火熱的全棧開發語言,本人卻一直沒有正式在專案中使用,最近專案重構中需要使用kotlin語言,這篇部落格也作為乙個學習筆記。在專案的bulid.gradle 中配置 buildscript dependencies kotlin 支援擴充套件,使用kotli...