golang序列化,golang序列化存數據庫

本文目錄一覽:

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-hant/n/132277.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ARQZ的頭像ARQZ
上一篇 2024-10-03 23:51
下一篇 2024-10-03 23:51

相關推薦

  • 金額選擇性序列化

    本文將從多個方面對金額選擇性序列化進行詳細闡述,包括其定義、使用場景、實現方法等。 一、定義 金額選擇性序列化指根據傳入的金額值,選擇是否進行序列化,以達到減少數據傳輸的目的。在實…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 數據庫第三範式會有刪除插入異常

    如果沒有正確設計數據庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係數據庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的數據庫存儲引擎

    本文將介紹兩款高性能的數據庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文將從多個方面深入探討Java反序列化漏洞,對於筆者所總結的經驗和教訓,以及掌握Java反序列化的設計模式、最佳實踐和防範措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    編程 2025-04-28
  • Python怎麼導入數據庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的數據庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • Think-ORM數據模型及數據庫核心操作

    本文主要介紹Think-ORM數據模型建立和數據庫核心操作。 一、模型定義 Think-ORM是一個開源的ORM框架,用於簡化在PHP應用中(特別是ThinkPHP)與關係數據庫之…

    編程 2025-04-27

發表回復

登錄後才能評論