本文目錄一覽:
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