go語言不能序列化的類型,go語言不能序列化的類型有哪些

golang map[string]string數(shù)組編碼成json格式,或者序列化,如php的serialize函數(shù);就是將數(shù)組變成字符串

json.Marshal() 可以將大部分類型的數(shù)據(jù)轉(zhuǎn)成json格式的,比如map, struct等等

在新北等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),新北網(wǎng)站建設(shè)費(fèi)用合理。

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中級(jí)進(jìn)階(二):結(jié)構(gòu)體

目錄

一、結(jié)構(gòu)體詳解

1. 結(jié)構(gòu)體定義

2. 實(shí)例化結(jié)構(gòu)體的7種方法

二、結(jié)構(gòu)體方法

1. 結(jié)構(gòu)體的方法定義

2. 結(jié)構(gòu)體內(nèi)自定義方法的引用

3. 任意類型添加方法

三、嵌套、繼承

1. 匿名結(jié)構(gòu)體

2. 結(jié)構(gòu)體中可以定義任意類型的字段

3. 結(jié)構(gòu)體嵌套結(jié)構(gòu)體

4. 結(jié)構(gòu)體嵌套匿名結(jié)構(gòu)體

5. 結(jié)構(gòu)體嵌套多個(gè)匿名結(jié)構(gòu)體

6. 結(jié)構(gòu)體繼承

四、結(jié)構(gòu)體和JSON相互轉(zhuǎn)換

1. 結(jié)構(gòu)體轉(zhuǎn)化成json

2. json轉(zhuǎn)化成結(jié)構(gòu)體

3. 結(jié)構(gòu)體標(biāo)簽 tag

4. 嵌套結(jié)構(gòu)體和json的序列化反序列化

Golang 中沒有“類”的概念,Golang 中的結(jié)構(gòu)體和其他語言中的類有點(diǎn)相似。和其他面向?qū)?象語言中的類相比,Golang 中的結(jié)構(gòu)體具有更高的擴(kuò)展性和靈活性。

Golang 中的基礎(chǔ)數(shù)據(jù)類型可以表示一些事物的基本屬性,但是當(dāng)我們想表達(dá)一個(gè)事物的全 部或部分屬性時(shí),這時(shí)候再用單一的基本數(shù)據(jù)類型就無法滿足需求了,Golang 提供了一種 自定義數(shù)據(jù)類型,可以封裝多個(gè)基本數(shù)據(jù)類型,這種數(shù)據(jù)類型叫結(jié)構(gòu)體,英文名稱 struct。 也就是我們可以通過 struct 來定義自己的類型了。

使用 type 和 struct 關(guān)鍵字來定義結(jié)構(gòu)體,具體代碼格式如下:

type 類型名 struct {

字段名 字段類型

字段名 字段類型 …

}

其中:

? 類型名:表示自定義結(jié)構(gòu)體的名稱,在同一個(gè)包內(nèi)不能重復(fù)。

? 字段名:表示結(jié)構(gòu)體字段名。結(jié)構(gòu)體中的字段名必須唯一。

? 字段類型:表示結(jié)構(gòu)體字段的具體類型。

在 go 語言中,沒有類的概念但是可以給類型(結(jié)構(gòu)體,自定義類型)定義方法。所謂方法 就是定義了接收者的函數(shù)。接收者的概念就類似于其他語言中的 this 或者 self。

方法的定義格式如下:

func (接收者變量 接收者類型) 方法名(參數(shù)列表) (返回參數(shù)) {

函數(shù)體

}

注意:想改變結(jié)構(gòu)體內(nèi)的值,必須先變成指針。

在 Go 語言中,接收者的類型可以是任何類型,不僅僅是結(jié)構(gòu)體,任何類型都可以擁有方法。 舉個(gè)例子,我們基于內(nèi)置的 int 類型使用 type 關(guān)鍵字可以定義新的自定義類型,然后為我們 的自定義類型添加方法。

注意:匿名結(jié)構(gòu)體中不允許出現(xiàn)多個(gè)重復(fù)的類型

注意:如果結(jié)構(gòu)體里面有私有屬性也就是小寫定義的字段,則不會(huì)被json使用

Go語言基礎(chǔ)語法(一)

本文介紹一些Go語言的基礎(chǔ)語法。

先來看一個(gè)簡單的go語言代碼:

go語言的注釋方法:

代碼執(zhí)行結(jié)果:

下面來進(jìn)一步介紹go的基礎(chǔ)語法。

go語言中格式化輸出可以使用 fmt 和 log 這兩個(gè)標(biāo)準(zhǔn)庫,

常用方法:

示例代碼:

執(zhí)行結(jié)果:

更多格式化方法可以訪問中的fmt包。

log包實(shí)現(xiàn)了簡單的日志服務(wù),也提供了一些格式化輸出的方法。

執(zhí)行結(jié)果:

下面來介紹一下go的數(shù)據(jù)類型

下表列出了go語言的數(shù)據(jù)類型:

int、float、bool、string、數(shù)組和struct屬于值類型,這些類型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類型,存儲(chǔ)的是一個(gè)地址,這個(gè)地址存儲(chǔ)最終的值。

常量是在程序編譯時(shí)就確定下來的值,程序運(yùn)行時(shí)無法改變。

執(zhí)行結(jié)果:

執(zhí)行結(jié)果:

Go 語言的運(yùn)算符主要包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符以及指針相關(guān)運(yùn)算符。

算術(shù)運(yùn)算符:

關(guān)系運(yùn)算符:

邏輯運(yùn)算符:

位運(yùn)算符:

賦值運(yùn)算符:

指針相關(guān)運(yùn)算符:

下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯(lián)用,這里不做介紹。

if語法格式如下:

if ... else :

else if:

示例代碼:

語法格式:

另外,添加 fallthrough 會(huì)強(qiáng)制執(zhí)行后面的 case 語句,不管下一條case語句是否為true。

示例代碼:

執(zhí)行結(jié)果:

下面介紹幾種循環(huán)語句:

執(zhí)行結(jié)果:

執(zhí)行結(jié)果:

也可以通過標(biāo)記退出循環(huán):

--THE END--

GoLang -- json文件操作

json格式可以算我們?nèi)粘W畛S玫男蛄谢袷街涣?,Go語言作為一個(gè)由Google開發(fā),號(hào)稱互聯(lián)網(wǎng)的C語言的語言,自然也對(duì)JSON格式支持很好。官方提供的Json解析包已經(jīng)非常強(qiáng)大,我們接下來講解Json的序列化與反序列化操作。另外還有一些第三方的Json解析庫,也能夠高效的操作Json對(duì)象,比如simplejson,ffjson等。下面是兩個(gè)比較重要的函數(shù):

? Json Marshal:將數(shù)據(jù)編碼成json字符串

Marshal 用于將struct對(duì)象序列化到j(luò)son對(duì)象中。v是interface{}類型,任何類型都實(shí)現(xiàn)了空接口。

1:tag中的第一個(gè)參數(shù)是用來指定別名,比如Name 指定別名為 username `json:"username"`

2:如果不想指定別名但是想指定其他參數(shù)用逗號(hào)來分隔,omitempty 指定到一個(gè)field時(shí),如果在賦值時(shí)對(duì)該屬性未賦值或者對(duì)該屬性賦值為 zero value,那么將Person序列化成json時(shí)會(huì)忽略該字段

3:- 指定到一個(gè)field時(shí),無論有沒有值,將Person序列化成json時(shí)都會(huì)忽略該字段

4:string 指定到一個(gè)field時(shí),比如Person中的Count為int類型 如果沒有任何指定在序列化到j(luò)son之后也是int 比如這個(gè)樣子 “Count”:0,但是如果指定了string之后序列化之后也是string類型的,那么就是這個(gè)樣子"Count":"0"

? struct序列化為Json

? slice序列化為Json

? map 序列化為Json

? Json Unmarshal:將json字符串解碼到相應(yīng)的數(shù)據(jù)結(jié)構(gòu),Unmarshal的第一個(gè)參數(shù)是[]byte,第二個(gè)參數(shù)是接受json解析的數(shù)據(jù)結(jié)構(gòu)。

下面我們依次講解Json的操作。

1:將Json序列化進(jìn)入結(jié)構(gòu)體

2::將Json序列化到結(jié)構(gòu)體slice

3:將Json序列化進(jìn)Map

4:將Json序列化進(jìn)Slice

go語言json處理

json是一種經(jīng)常使用的數(shù)據(jù)格式,下面總結(jié)一下json的使用

json與struct轉(zhuǎn)換的話struct的屬性必須首字母大寫。

當(dāng)用的多了就會(huì)發(fā)現(xiàn)一個(gè)致命的問題:go默認(rèn)會(huì)將特殊字符轉(zhuǎn)義采用以下方法可以解決:

處理方法1

處理方法2

不管是屬性組成的還是Tag組成的json字符串,都可以正常的解析

tag:

json:"-" // 表示不進(jìn)行序列化

IsOnSale bool json:"is_on_sale,string" //序列化后轉(zhuǎn)成string

ProductID int64 json:"product_id,omitempty" //為零值時(shí)忽略

序列化或者反序列化時(shí)可以指定類型,支持string,number和boolean

IsOnSale bool json:"is_on_sale,string"

注意:

正確使用第一個(gè),第二個(gè)回報(bào)錯(cuò)

Golang中的自定義json序列化

后端開發(fā)人員跟前端對(duì)接接口的時(shí)候,或多或少都會(huì)面臨一些溝通問題,比如說枚舉字符的定義,比如有整形狀態(tài)字段: state

通常給前端的時(shí)候,前段要做的是將1,2,3以及對(duì)應(yīng)的中文釋義存儲(chǔ)為key/value的形式,key與value單看都無法知道對(duì)方的語義,

比如我只知道狀態(tài)值為“1”, 是無法將其與“成功”對(duì)應(yīng)起來的(當(dāng)然這套狀態(tài)的設(shè)計(jì)者肯定是知道的),后端通常給到前端的restful api

接口定義也是key/value的形式,這乍一看其實(shí)也沒啥毛病,只要有key/value也沒問題,后端定義通常會(huì)是

但數(shù)字的表現(xiàn)形式終歸是不不太明確的,如果對(duì)狀態(tài)的定義換成以下形式:

基本可以理解為中英文互譯了,理解起來也會(huì)更清晰一些不是,如果這么做的話,后端給到前端的響應(yīng)字段狀態(tài)的類型就需要修改成字符器格式

后端還是要做一層字符串到整型的轉(zhuǎn)換,從目的來講,我們只是想返給前端的 state 字段是字符串而已,也就是在做json序列化的時(shí)候?qū)⒄团c字符串做一層轉(zhuǎn)換,有更優(yōu)雅的做法如下所示

只需要做兩件事,自定義類型 MyState ,實(shí)現(xiàn) MarshalJSON 方法

只要類型實(shí)現(xiàn)了 MarshalJSON 方法,在json序列化時(shí)就會(huì)調(diào)用此方法,如此一來,我們就輕松實(shí)現(xiàn)了自定義json序列化,反序列化同樣如此

實(shí)現(xiàn)起來也很簡單

需要注意的是, UnmarshalJSON 方法操作過程需要給 receiver 也就是 u 賦值,所以必須是指針類型,同樣的,在實(shí)現(xiàn)

MarshalJSON 方法, receiver 的類型需要與結(jié)構(gòu)體定義中的類型保持一致,否則自定義序列化會(huì)失敗

參考:

網(wǎng)頁題目:go語言不能序列化的類型,go語言不能序列化的類型有哪些
標(biāo)題來源:http://muchs.cn/article24/hcjdje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、靜態(tài)網(wǎng)站品牌網(wǎng)站設(shè)計(jì)、商城網(wǎng)站、微信小程序、網(wǎng)站策劃

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)