golang序列化pb,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 中結構體與位元組數組能相互轉化么

如果你的意思是byte的json串的話可以用json.Unmarshal()啊,大概意思就是這個吧,如果不嫌麻煩,用reflect可以把byte按自己的想法解析進結構體,就是麻煩點

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 的類型需要與結構體定義中的類型保持一致,否則自定義序列化會失敗

參考:

GRPC的HTTP返回值int64被轉為string類型

最近在使用http介面訪問一個GRPC的服務時遇到一個數據類型轉換的問題。一個時間戳欄位在PB中定義的欄位類型為uint64,返回到本地之後卻是一個string類型,在我用uint64去接收這個欄位時報了錯。

為什麼GRPC要把int64轉為string類型呢,他們的回答是遵循proto3的序列化規則,proto3的json-mapping中規定了int64/uint64/fixed64類型映射的json類型為string。如圖:(PB文檔地址: )

很多人都質疑PB的這個行為,然而這並不能改變什麼,下面是一個關於該問題的回答,大意就是:JS使用了52bit去實現IEEE754的雙精度數,也就是說js在不丟失信息的情況下最大能表示的數是 2^52 。64位的數在JS中直接使用是會有問題了。PB為了客戶端能正常處理數據而把64位數值直接轉換為了string類型。

本人使用的是golang語言,在處理http返回值時,使用jsonpb包代替了json包去解析返回的二進位數據。不過解析出來的是message格式的,用的時候還需要進一步加工處理,相比較與轉換string類型到int64,感覺還是簡單一點。

原創文章,作者:VPVD,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/149747.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VPVD的頭像VPVD
上一篇 2024-11-05 16:54
下一篇 2024-11-05 16:54

相關推薦

  • 金額選擇性序列化

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

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

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

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

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

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

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

    編程 2025-04-28
  • Go語言爬蟲對比Python

    在代碼執行效率和應用場景上,Go語言和Python都有各自的優勢。Go語言致力於高效、高並發的網路應用開發,而Python則具有強大的數據挖掘、機器學習和科學計算能力。最近,隨著G…

    編程 2025-04-27
  • 如何使用Shell對比兩個文件並去除重複行

    Shell腳本是編寫在UNIX或Linux系統上的一種程序語言,可以幫助用戶高效自動地完成一些系統常規操作。在Shell腳本語言中,常常需要比較文件的內容並去除其中的重複行。下面我…

    編程 2025-04-27
  • Shell對比字元串

    本文將從多個方面介紹Shell對比字元串的方法和技巧。 一、基本操作 Shell的對比字元串操作主要使用test或者[ ]操作符,其中test是[ ]的等價形式。可以使用man t…

    編程 2025-04-27
  • Golang中使用strings.Split函數進行字元串分割的方法

    一、Split函數的基本用法 字元串是編程中常見的數據類型,它們可以在程序中被處理、存儲和傳輸。在Go語言中,字元串也是一個基本的數據類型,而strings包提供了一些操作字元串的…

    編程 2025-04-23
  • 深入下探golang http server

    Go語言已經成為了軟體開發領域的熱門語言,它的高性能、應用廣泛、安全性好,使得它成為了眾多開發者心目中的首選編程語言。在眾多應用場景中,golang http server的應用非…

    編程 2025-04-23
  • Golang環境變數全面解析

    Golang是一門非常流行的開發語言,擁有高效的CGO、簡單易懂的語法、高並發能力等優點,然而它也需要使用環境變數來配置一些參數。在本篇文章中,我們將從多個方面對Golang環境變…

    編程 2025-04-23

發表回復

登錄後才能評論