后端開發(fā)人員跟前端對(duì)接接口的時(shí)候,或多或少都會(huì)面臨一些溝通問(wèn)題,比如說(shuō)枚舉字符的定義,比如有整形狀態(tài)字段: state
創(chuàng)新互聯(lián)成立以來(lái)不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點(diǎn),以客戶需求中心、市場(chǎng)為導(dǎo)向”的快速反應(yīng)體系。對(duì)公司的主營(yíng)項(xiàng)目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計(jì)、行業(yè) / 企業(yè)門戶設(shè)計(jì)推廣、行業(yè)門戶平臺(tái)運(yùn)營(yíng)、app軟件定制開發(fā)、成都做手機(jī)網(wǎng)站、微信網(wǎng)站制作、軟件開發(fā)、德陽(yáng)服務(wù)器托管等實(shí)行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從創(chuàng)新互聯(lián)可以獲得的服務(wù)效果。
通常給前端的時(shí)候,前段要做的是將1,2,3以及對(duì)應(yīng)的中文釋義存儲(chǔ)為key/value的形式,key與value單看都無(wú)法知道對(duì)方的語(yǔ)義,
比如我只知道狀態(tài)值為“1”, 是無(wú)法將其與“成功”對(duì)應(yīng)起來(lái)的(當(dāng)然這套狀態(tài)的設(shè)計(jì)者肯定是知道的),后端通常給到前端的restful api
接口定義也是key/value的形式,這乍一看其實(shí)也沒(méi)啥毛病,只要有key/value也沒(méi)問(wèn)題,后端定義通常會(huì)是
但數(shù)字的表現(xiàn)形式終歸是不不太明確的,如果對(duì)狀態(tài)的定義換成以下形式:
基本可以理解為中英文互譯了,理解起來(lái)也會(huì)更清晰一些不是,如果這么做的話,后端給到前端的響應(yīng)字段狀態(tài)的類型就需要修改成字符器格式
后端還是要做一層字符串到整型的轉(zhuǎn)換,從目的來(lái)講,我們只是想返給前端的 state 字段是字符串而已,也就是在做json序列化的時(shí)候?qū)⒄团c字符串做一層轉(zhuǎn)換,有更優(yōu)雅的做法如下所示
只需要做兩件事,自定義類型 MyState ,實(shí)現(xiàn) MarshalJSON 方法
只要類型實(shí)現(xiàn)了 MarshalJSON 方法,在json序列化時(shí)就會(huì)調(diào)用此方法,如此一來(lái),我們就輕松實(shí)現(xiàn)了自定義json序列化,反序列化同樣如此
實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單
需要注意的是, UnmarshalJSON 方法操作過(guò)程需要給 receiver 也就是 u 賦值,所以必須是指針類型,同樣的,在實(shí)現(xiàn)
MarshalJSON 方法, receiver 的類型需要與結(jié)構(gòu)體定義中的類型保持一致,否則自定義序列化會(huì)失敗
參考:
C語(yǔ)言中變量的聲明/定義格式如下:存儲(chǔ)類型 類型修飾符 數(shù)據(jù)類型 變量名;存儲(chǔ)類型:用來(lái)指明變量的存儲(chǔ)位置,即運(yùn)行該變量在哪一段分配內(nèi)存空間,常見的存儲(chǔ)位置有auto、extern、register、static,在一段執(zhí)行程序中,可以為變量分配存儲(chǔ)空間的有BSS、數(shù)據(jù)區(qū)、棧區(qū)、堆區(qū)。類型修飾符:用來(lái)修飾變量的存儲(chǔ)和表現(xiàn)方式。包括long、short、signed、unsigned、void、const、volatile等。數(shù)據(jù)類型:用來(lái)指明該變量的存儲(chǔ)大小,即一個(gè)該類型的變量要占用多少內(nèi)存空間?;緮?shù)據(jù)類型有(char、int、float、指針類型)和由基本數(shù)據(jù)類型組成的用戶自定義類型(struct、enum、typedef、union)
作為C語(yǔ)言家族的一員,go和c一樣也支持結(jié)構(gòu)體??梢灶惐扔趈ava的一個(gè)POJO。
在學(xué)習(xí)定義結(jié)構(gòu)體之前,先學(xué)習(xí)下定義一個(gè)新類型。
新類型 T1 是基于 Go 原生類型 int 定義的新自定義類型,而新類型 T2 則是 基于剛剛定義的類型 T1,定義的新類型。
這里要引入一個(gè)底層類型的概念。
如果一個(gè)新類型是基于某個(gè) Go 原生類型定義的, 那么我們就叫 Go 原生類型為新類型的底層類型
在上面的例子中,int就是T1的底層類型。
但是T1不是T2的底層類型,只有原生類型才可以作為底層類型,所以T2的底層類型還是int
底層類型是很重要的,因?yàn)閷?duì)兩個(gè)變量進(jìn)行顯式的類型轉(zhuǎn)換,只有底層類型相同的變量間才能相互轉(zhuǎn)換。底層類型是判斷兩個(gè)類型本質(zhì)上是否相同的根本。
這種類型定義方式通常用在 項(xiàng)目的漸進(jìn)式重構(gòu),還有對(duì)已有包的二次封裝方面
類型別名表示新類型和原類型完全等價(jià),實(shí)際上就是同一種類型。只不過(guò)名字不同而已。
一般我們都是定義一個(gè)有名的結(jié)構(gòu)體。
字段名的大小寫決定了字段是否包外可用。只有大寫的字段可以被包外引用。
還有一個(gè)點(diǎn)提一下
如果換行來(lái)寫
Age: 66,后面這個(gè)都好不能省略
還有一個(gè)點(diǎn),觀察e3的賦值
new返回的是一個(gè)指針。然后指針可以直接點(diǎn)號(hào)賦值。這說(shuō)明go默認(rèn)進(jìn)行了取值操作
e3.Age 等價(jià)于 (*e3).Age
如上定義了一個(gè)空的結(jié)構(gòu)體Empty。打印了元素e的內(nèi)存大小是0。
有什么用呢?
基于空結(jié)構(gòu)體類型內(nèi)存零開銷這樣的特性,我們?cè)谌粘?Go 開發(fā)中會(huì)經(jīng)常使用空 結(jié)構(gòu)體類型元素,作為一種“事件”信息進(jìn)行 Goroutine 之間的通信
這種以空結(jié)構(gòu)體為元素類建立的 channel,是目前能實(shí)現(xiàn)的、內(nèi)存占用最小的 Goroutine 間通信方式。
這種形式需要說(shuō)的是幾個(gè)語(yǔ)法糖。
語(yǔ)法糖1:
對(duì)于結(jié)構(gòu)體字段,可以省略字段名,只寫結(jié)構(gòu)體名。默認(rèn)字段名就是結(jié)構(gòu)體名
這種方式稱為 嵌入字段
語(yǔ)法糖2:
如果是以嵌入字段形式寫的結(jié)構(gòu)體
可以省略嵌入的Reader字段,而直接訪問(wèn)ReaderName
此時(shí)book是一個(gè)各個(gè)屬性全是對(duì)應(yīng)類型零值的一個(gè)實(shí)例。不是nil。這種情況在Go中稱為零值可用。不像java會(huì)導(dǎo)致npe
結(jié)構(gòu)體定義時(shí)可以在字段后面追加標(biāo)簽說(shuō)明。
tag的格式為反單引號(hào)
tag的作用是可以使用[反射]來(lái)檢視字段的標(biāo)簽信息。
具體的作用還要看使用的場(chǎng)景。
比如這里的tag是為了幫助 encoding/json 標(biāo)準(zhǔn)包在解析對(duì)象時(shí)可以利用的規(guī)則。比如omitempty表示該字段沒(méi)有值就不打印出來(lái)。
網(wǎng)頁(yè)名稱:go語(yǔ)言自定義的類型,go語(yǔ)言自定義類型JSON
分享URL:http://chinadenli.net/article34/hegdpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、域名注冊(cè)、App開發(fā)、搜索引擎優(yōu)化、網(wǎng)頁(yè)設(shè)計(jì)公司、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)