【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)
目錄【閱讀時間:約5分鐘】
- 一.概述
- 1.Json的作用
- 2.Go官方 encoding/json 包
- 3. golang json的主要操作
- 二.Json Marshal:將數據編碼成json字符串
- 三.Json Unmarshal:將json字符串解碼到相應的數據結構
- 四.myJsonMarshal程序包開發的踩坑經歷
- 1.go doc的第一個坑——函數名首字母要大寫
- 2.go doc的第二個坑——函數注釋要在函數定義前一行,并且注釋開頭應為函數名
一.概述
1.Json的作用
Json(Javascript Object Nanotation)是一種數據交換格式,常用于前后端數據傳輸。任意一端將數據轉換成json 字符串,另一端再將該字符串解析成相應的數據結構,如string類型,strcut對象等。
2.Go官方 encoding/json 包
Go官方 encoding/json 包 實現了 RFC 4627 中定義的 JSON 的編碼和解碼。JSON 和 Go值之間的映射在 Marshal 和 Unmarshal 函數的文檔中進行了描述。
官方源碼:https://github.com/golang/go/blob/master/src/encoding/json/encode.go
3. golang json的主要操作
根據上面兩節的介紹,我們簡單可以將golang json的主要操作分為以下兩種:
①Json Marshal:將數據編碼成json字符串
②Json Unmarshal:將json字符串解碼到相應的數據結構
使用這兩種json操作,可以極大地方便前后端的數據傳輸操作。
二.Json Marshal:將數據編碼成json字符串
Marshal函數的作用結果很直觀,就是將輸入的結構化數據,轉為json字符流并輸出。
我們可以自定義輸入的數據類型以及相應的值,并將其轉為符合規則的json字符流。
簡單的使用樣例如下(別忘了"import encoding/json"):
type Stu struct {Name string `json:"name"`Age intHIgh boolsex stringClass *Class `json:"class"`
}type Class struct {Name stringGrade int
}func main() {//實例化一個數據結構,用于生成json字符串stu := Stu{Name: "張三",Age: 18,HIgh: true,sex: "男",}//指針變量cla := new(Class)cla.Name = "1班"cla.Grade = 3stu.Class=cla//Marshal失敗時err!=niljsonStu, err := json.Marshal(stu)if err != nil {fmt.Println("生成json字符串錯誤")}//jsonStu是[]byte類型,轉化成string類型便于查看fmt.Println(string(jsonStu))
}
運行結果:
{"name":"張三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}
由此可知程序包有如下幾個特性:
①結構化數據轉為json字符流
②支持字段的標簽(Tag),標簽滿足 json:“你自己的定義”。
③指針變量編碼時自動轉換為它所指向的值
三.Json Unmarshal:將json字符串解碼到相應的數據結構
Unmarshal函數的作用結果也很直觀,就是將輸入的json字符流,轉為相應的結構化數據并輸出。
Unmarshal函數可以看作是Marshal函數的逆過程,用于json的解碼。
同樣地,展示簡單的使用樣例如下(別忘了"import encoding/json"):
type StuRead struct {Name interface{} `json:"name"`Age interface{}HIgh interface{}sex interface{}Class interface{} `json:"class"`Test interface{}
}type Class struct {Name stringGrade int
}func main() {//json字符中的"引號,需用\進行轉義,否則編譯出錯//json字符串沿用上面的結果,但對key進行了大小的修改,并添加了sex數據data:="{\"name\":\"張三\",\"Age\":18,\"high\":true,\"sex\":\"男\",\"CLASS\":{\"naME\":\"1班\",\"GradE\":3}}"str:=[]byte(data)//1.Unmarshal的第一個參數是json字符串,第二個參數是接受json解析的數據結構。//第二個參數必須是指針,否則無法接收解析的數據,如stu仍為空對象StuRead{}//2.可以直接stu:=new(StuRead),此時的stu自身就是指針stu:=StuRead{}err:=json.Unmarshal(str,&stu)//解析失敗會報錯,如json字符串格式不對,缺"號,缺}等。if err!=nil{fmt.Println(err)}fmt.Println(stu)
}
運行結果:
{張三 18 true <nil> map[naME:1班 GradE:3] <nil>}
四.myJsonMarshal程序包開發的踩坑經歷
基于Go官方 encoding/json 包,筆者簡單地復現了其中的Marshal函數,詳情可見基于Golang的對象序列化的程序包開發——myJsonMarshal。
1.go doc的第一個坑——函數名首字母要大寫
在進行go doc輸出API文檔時,筆者發現有些函數一直都無法自動生成API、有些函數能生成API的“詭異現象”,網上搜索也無相關的資料(吐槽一下go doc的資料也太少了吧!)
經過筆者的不斷嘗試,才發現原來是自己函數風格的問題,在go doc中,如果要通過以下命令生成API文檔:
godoc -url="pkg/github.com/user/myJsonMarshal" > API.html
那么,函數名首字母必須要大寫。當然我們也可以通過以下指令使API文檔強制輸出首字母非大寫的函數:
godoc -u
當這種方法并不能生成API文檔,只能在終端上顯示有哪些函數,并且以下指令都是會報錯的:
godoc -u -url="pkg/github.com/user/myJsonMarshal" > API.html
godoc -url="pkg/github.com/user/myJsonMarshal" > API.html -u
因此,我們還是老老實實地養成函數名首字母大寫的習慣吧~
2.go doc的第二個坑——函數注釋要在函數定義前一行,并且注釋開頭應為函數名
在寫完函數注釋后,筆者發現通過go doc生成的API文檔居然沒有顯示相應的中文注釋,一開始筆者以為是語言支持等問題而盲目搗鼓了不短的時間,后來才發現go doc自動生成注釋時,其函數注釋要在函數定義前一行,并且注釋開頭應為函數名。
注釋格式舉例:
//A 是一個樣例函數
func A {//code
}
總結
以上是生活随笔為你收集整理的【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Golang的对象序列化的程序包开发
- 下一篇: 【ReactiveX】基于Golang