本文目錄一覽:
- 1、golang中級進階(二):結構體
- 2、Golang中的自定義json序列化
- 3、golang map[string]string數組編碼成json格式,或者序列化,如php的serialize函數;就是將數組變成字元串
- 4、golang的xorm如何將[]map[string][]byte 格式的數據序列化成json輸出
- 5、json庫在golang中的使用
- 6、GoLang — json文件操作
golang中級進階(二):結構體
目錄
一、結構體詳解
1. 結構體定義
2. 實例化結構體的7種方法
二、結構體方法
1. 結構體的方法定義
2. 結構體內自定義方法的引用
3. 任意類型添加方法
三、嵌套、繼承
1. 匿名結構體
2. 結構體中可以定義任意類型的欄位
3. 結構體嵌套結構體
4. 結構體嵌套匿名結構體
5. 結構體嵌套多個匿名結構體
6. 結構體繼承
四、結構體和JSON相互轉換
1. 結構體轉化成json
2. json轉化成結構體
3. 結構體標籤 tag
4. 嵌套結構體和json的序列化反序列化
Golang 中沒有「類」的概念,Golang 中的結構體和其他語言中的類有點相似。和其他面向對 象語言中的類相比,Golang 中的結構體具有更高的擴展性和靈活性。
Golang 中的基礎數據類型可以表示一些事物的基本屬性,但是當我們想表達一個事物的全 部或部分屬性時,這時候再用單一的基本數據類型就無法滿足需求了,Golang 提供了一種 自定義數據類型,可以封裝多個基本數據類型,這種數據類型叫結構體,英文名稱 struct。 也就是我們可以通過 struct 來定義自己的類型了。
使用 type 和 struct 關鍵字來定義結構體,具體代碼格式如下:
type 類型名 struct {
欄位名 欄位類型
欄位名 欄位類型 …
}
其中:
• 類型名:表示自定義結構體的名稱,在同一個包內不能重複。
• 欄位名:表示結構體欄位名。結構體中的欄位名必須唯一。
• 欄位類型:表示結構體欄位的具體類型。
在 go 語言中,沒有類的概念但是可以給類型(結構體,自定義類型)定義方法。所謂方法 就是定義了接收者的函數。接收者的概念就類似於其他語言中的 this 或者 self。
方法的定義格式如下:
func (接收者變數 接收者類型) 方法名(參數列表) (返回參數) {
函數體
}
注意:想改變結構體內的值,必須先變成指針。
在 Go 語言中,接收者的類型可以是任何類型,不僅僅是結構體,任何類型都可以擁有方法。 舉個例子,我們基於內置的 int 類型使用 type 關鍵字可以定義新的自定義類型,然後為我們 的自定義類型添加方法。
注意:匿名結構體中不允許出現多個重複的類型
注意:如果結構體裡面有私有屬性也就是小寫定義的欄位,則不會被json使用
Golang中的自定義json序列化
後端開發人員跟前端對接介面的時候,或多或少都會面臨一些溝通問題,比如說枚舉字元的定義,比如有整形狀態欄位: state
通常給前端的時候,前段要做的是將1,2,3以及對應的中文釋義存儲為key/value的形式,key與value單看都無法知道對方的語義,
比如我只知道狀態值為「1」, 是無法將其與「成功」對應起來的(當然這套狀態的設計者肯定是知道的),後端通常給到前端的restful api
介面定義也是key/value的形式,這乍一看其實也沒啥毛病,只要有key/value也沒問題,後端定義通常會是
但數字的表現形式終歸是不不太明確的,如果對狀態的定義換成以下形式:
基本可以理解為中英文互譯了,理解起來也會更清晰一些不是,如果這麼做的話,後端給到前端的響應欄位狀態的類型就需要修改成字元器格式
後端還是要做一層字元串到整型的轉換,從目的來講,我們只是想返給前端的 state 欄位是字元串而已,也就是在做json序列化的時候將整型與字元串做一層轉換,有更優雅的做法如下所示
只需要做兩件事,自定義類型 MyState ,實現 MarshalJSON 方法
只要類型實現了 MarshalJSON 方法,在json序列化時就會調用此方法,如此一來,我們就輕鬆實現了自定義json序列化,反序列化同樣如此
實現起來也很簡單
需要注意的是, UnmarshalJSON 方法操作過程需要給 receiver 也就是 u 賦值,所以必須是指針類型,同樣的,在實現
MarshalJSON 方法, receiver 的類型需要與結構體定義中的類型保持一致,否則自定義序列化會失敗
參考:
golang map[string]string數組編碼成json格式,或者序列化,如php的serialize函數;就是將數組變成字元串
json.Marshal() 可以將大部分類型的數據轉成json格式的,比如map, struct等等
package main
import (
“log”
“fmt”
“encoding/json”
)
func main() {
v := map[string]string{
“name”:”foo”,
}
data, err := json.Marshal(v)
if err != nil {
log.Println(err)
return
}
fmt.Println(string(data))
}
golang的xorm如何將[]map[string][]byte 格式的數據序列化成json輸出
其實你的問題在與最後一段是[]byte
如果直接轉json出來的數據是一個base64的字元串
所以你要做的應該是把最後的這個[]byte按字元串直接輸出。
自己手動轉一下吧。
json庫在golang中的使用
golang對json序列化和反序列化的操作實在是難受,所以說用習慣了高級語言特性,再轉到這些偏原生的寫法上就會很難受。
不多BB,開始記錄。
當寫個小demo或者做個小工具,沒有大規模使用場景,那使用哪個庫都是一樣的,因為性能的體現並不會很明顯。但是如果是在實際項目中使用,且伴隨著高並發,大容量等場景,我還是推薦使用 json-iterator 。
號稱最快的go json解析器。跟官方的寫法兼容,我目前基本都使用這個。
效率對比
ns 納秒 op 操作
倆種方式,一種直接反序列化成 結構體數組,另一種反序列化為 slice,內容為map[string]interface{}
結構體數組
slice
GoLang — json文件操作
json格式可以算我們日常最常用的序列化格式之一了,Go語言作為一個由Google開發,號稱互聯網的C語言的語言,自然也對JSON格式支持很好。官方提供的Json解析包已經非常強大,我們接下來講解Json的序列化與反序列化操作。另外還有一些第三方的Json解析庫,也能夠高效的操作Json對象,比如simplejson,ffjson等。下面是兩個比較重要的函數:
• Json Marshal:將數據編碼成json字元串
Marshal 用於將struct對象序列化到json對象中。v是interface{}類型,任何類型都實現了空介面。
1:tag中的第一個參數是用來指定別名,比如Name 指定別名為 username `json:”username”`
2:如果不想指定別名但是想指定其他參數用逗號來分隔,omitempty 指定到一個field時,如果在賦值時對該屬性未賦值或者對該屬性賦值為 zero value,那麼將Person序列化成json時會忽略該欄位
3:- 指定到一個field時,無論有沒有值,將Person序列化成json時都會忽略該欄位
4:string 指定到一個field時,比如Person中的Count為int類型 如果沒有任何指定在序列化到json之後也是int 比如這個樣子 「Count」:0,但是如果指定了string之後序列化之後也是string類型的,那麼就是這個樣子”Count”:”0″
• struct序列化為Json
• slice序列化為Json
• map 序列化為Json
• Json Unmarshal:將json字元串解碼到相應的數據結構,Unmarshal的第一個參數是[]byte,第二個參數是接受json解析的數據結構。
下面我們依次講解Json的操作。
1:將Json序列化進入結構體
2::將Json序列化到結構體slice
3:將Json序列化進Map
4:將Json序列化進Slice
原創文章,作者:ARQZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/132277.html