日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

發布時間:2023/11/28 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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程序包开发的踩坑经历 :)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。