国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go JSON v2 來(lái)了!!!

開(kāi)發(fā) 前端
從目前的設(shè)計(jì)來(lái)看,JSON v2 確實(shí)解決了現(xiàn)有 ??encoding/json?? 包的很多痛點(diǎn):性能大幅提升、API 更加靈活、支持更多自定義選項(xiàng)。雖然學(xué)習(xí)成本有一定增加,但是帶來(lái)的收益是值得的。

說(shuō)實(shí)話,現(xiàn)有的 encoding/json 包雖然能用,但是各種限制和性能問(wèn)題確實(shí)讓人頭疼,特別是處理大量數(shù)據(jù)的時(shí)候,那速度真的是...很容易擺爛。

新版本 Go1.25 有一個(gè)很多 Gopher 期待已久的新標(biāo)準(zhǔn)庫(kù)——JSON v2[1](實(shí)驗(yàn)階段),能夠較好的解決這個(gè)煩惱。

圖片圖片

為什么需要 JSON v2?

第一:現(xiàn)有的 encoding/json 包確實(shí)有不少歷史包袱。從 Go 1.0 到現(xiàn)在,這個(gè)包基本沒(méi)怎么大改過(guò),很多設(shè)計(jì)上的問(wèn)題一直拖著。比如說(shuō):

  • Encoder/Decoder 的 API 設(shè)計(jì)不夠靈活。
  • 自定義序列化的方式太單一。
  • 性能問(wèn)題,特別是反序列化的性能。
  • 一些默認(rèn)行為不太合理。

第二:社區(qū)呼聲很高。你去看看 GitHub 上的 issue,關(guān)于 JSON 包的吐槽那是一抓一大把。大家都希望有個(gè)更好用、更快的 JSON 包。

但很無(wú)奈的是,Go 的兼容性承諾在那擺著,不能隨便改現(xiàn)有的 API。

所以 Go 團(tuán)隊(duì)這次的思路是:搞個(gè) v2,先用 GOEXPERIMENT 來(lái)控制。

JSON v2 到底改了啥?

接下來(lái)我們看下 JSON v2 的核心變化。這個(gè)新版本不是簡(jiǎn)單的修修補(bǔ)補(bǔ)。

是從 API 設(shè)計(jì)到內(nèi)部實(shí)現(xiàn)的全面重構(gòu)。所以搞了很久才釋出。

新的 API 設(shè)計(jì)

最明顯的變化就是 API:

圖片圖片

以下是一些要點(diǎn)介紹。

更直觀的 IO 操作

原來(lái)我們要寫(xiě)入 io.Writer 或者從 io.Reader 讀取,得用 Encoder 和 Decoder

// v1 的寫(xiě)法
alice := Person{Name: "Alice", Age: 25}
out := new(strings.Builder)
enc := json.NewEncoder(out)
enc.Encode(alice)
fmt.Println(out.String())

現(xiàn)在 v2 直接提供了 MarshalWrite 和 UnmarshalRead

// v2 的寫(xiě)法
alice := Person{Name: "Alice", Age: 25}
out := new(strings.Builder)
json.MarshalWrite(out, alice)
fmt.Println(out.String())

簡(jiǎn)單來(lái)說(shuō),就是少了一層中間商賺差價(jià)。

不過(guò)這里有幾個(gè)點(diǎn)需要注意:

  • MarshalWrite 不會(huì)添加換行符,而老的 Encoder.Encode 會(huì)。
  • UnmarshalRead 會(huì)讀取整個(gè) reader 直到 EOF,而老的 Decoder.Decode 只讀下一個(gè) JSON 值。

如果你需要流式處理,v2 也提供了新的方案。Encoder 和 Decoder 被移到了 jsontext 包,配合 MarshalEncode 和 UnmarshalDecode 使用:

// 流式編碼
people := []Person{
    {Name: "Alice", Age: 25},
    {Name: "Bob", Age: 30},
}
out := new(strings.Builder)
enc := jsontext.NewEncoder(out)

for _, p := range people {
    json.MarshalEncode(enc, p)
}

強(qiáng)大的配置選項(xiàng)

這個(gè)真的是 v2 的一大亮點(diǎn)。再也不用為了改個(gè)格式而頭疼了。

alice := Person{Name: "Alice", Age: 25}
b, _ := json.Marshal(
    alice,
    json.OmitZeroStructFields(true),  // 省略零值字段
    json.StringifyNumbers(true),      // 數(shù)字轉(zhuǎn)字符串
    jsontext.WithIndent("  "),       // 縮進(jìn)格式化
)
fmt.Println(string(b))

還可以用 JoinOptions 組合選項(xiàng):

opts := json.JoinOptions(
    jsontext.SpaceAfterColon(true),
    jsontext.SpaceAfterComma(true),
)
b, _ := json.Marshal(alice, opts)

增強(qiáng)的標(biāo)簽支持

v2 不僅支持原有的標(biāo)簽,還新增了幾個(gè)很實(shí)用的:

type Person struct {
    Name      string    `json:"name"`
    BirthDate time.Time `json:"birth_date,format:DateOnly"` // 格式化日期
    Address             `json:",inline"`                    // 內(nèi)聯(lián)字段
}

type Address struct {
    Street string `json:"street"`
    City   string `json:"city"`
}

inline 標(biāo)簽可以把嵌套對(duì)象的字段提升到父對(duì)象:

alice := Person{
    Name: "Alice",
    BirthDate: time.Date(2001, 7, 15, 12, 35, 43, 0, time.UTC),
    Address: Address{
        Street: "123 Main St",
        City:   "Wonderland",
    },
}
// 輸出會(huì)把 street 和 city 直接放在 Person 對(duì)象里

還有個(gè) unknown 標(biāo)簽,可以收集所有未知字段:

type Person struct {
    Name string         `json:"name"`
    Data map[string]any `json:",unknown"` // 收集未知字段
}

靈活的自定義序列化

這個(gè)功能真的讓我眼前一亮。以前要自定義序列化,必須給類(lèi)型實(shí)現(xiàn) MarshalJSON 方法。

現(xiàn)在你可以用 MarshalFunc 隨時(shí)定義:

// 把 bool 序列化成 ? 或 ?
boolMarshaler := json.MarshalFunc(
    func(val bool) ([]byte, error) {
        if val {
            return []byte(`"?"`), nil
        }
        return []byte(`"?"`), nil
    },
)

val := true
data, err := json.Marshal(val, json.WithMarshalers(boolMarshaler))
fmt.Println(string(data)) // "?"

還可以組合多個(gè)自定義序列化器:

// 可以同時(shí)處理 bool 和 bool-like 字符串
strMarshaler := json.MarshalToFunc(
    func(enc *jsontext.Encoder, val string) error {
        if val == "on" || val == "true" {
            return enc.WriteToken(jsontext.String("?"))
        }
        if val == "off" || val == "false" {
            return enc.WriteToken(jsontext.String("?"))
        }
        return json.SkipFunc // 跳過(guò),使用默認(rèn)序列化
    },
)

marshalers := json.JoinMarshalers(boolMarshaler, strMarshaler)

默認(rèn)行為的改進(jìn)

v2 修正了一些反直覺(jué)的默認(rèn)行為:

  • nil slice 現(xiàn)在序列化成 [] 而不是 null。
  • nil map 現(xiàn)在序列化成 {} 而不是 null
  • 字節(jié)數(shù)組默認(rèn)編碼為 base64 字符串,而不是數(shù)字?jǐn)?shù)組。
  • 字段名匹配默認(rèn)區(qū)分大小寫(xiě)。

例子如下:

type Person struct {
    Name    string
    Hobbies []string
    Skills  map[string]int
    Secret  [5]byte
}

alice := Person{
    Name:   "Alice",
    Secret: [5]byte{1, 2, 3, 4, 5},
}
// v2 輸出:
// {
//   "Name": "Alice",
//   "Hobbies": [],
//   "Skills": {},
//   "Secret": "AQIDBAU="
// }

如果想要 v1 的行為,可以通過(guò)選項(xiàng)配置:

b, _ := json.Marshal(
    alice,
    json.FormatNilMapAsNull(true),
    json.FormatNilSliceAsNull(true),
)

JSON v2 性能大幅提高

目前看來(lái),根據(jù)官方的 benchmark[2] 數(shù)據(jù),反序列化性能提升了 2.7 到 10.2 倍,這個(gè)提升幅度確實(shí)很可觀。

圖片圖片

特別是對(duì)于那些需要處理大量 JSON 數(shù)據(jù)的項(xiàng)目,比如微服務(wù)之間的通信、日志處理等場(chǎng)景,這個(gè)性能提升是實(shí)打?qū)嵉摹?/span>

如何嘗鮮?

我們來(lái)看下怎么體驗(yàn) JSON v2。目前 JSON v2 還在實(shí)驗(yàn)階段。

圖片圖片

需要設(shè)置環(huán)境變量開(kāi)啟:

GOEXPERIMENT=jsonv2 go build your_project

當(dāng)設(shè)置了這個(gè)標(biāo)志后:

  • 新的 encoding/json/v2 和 encoding/json/jsontext 包會(huì)生效。
  • 現(xiàn)有的 encoding/json 包會(huì)使用 v2 的實(shí)現(xiàn)。
  • 可以使用 v2 提案中的新 API。

總結(jié)

從目前的設(shè)計(jì)來(lái)看,JSON v2 確實(shí)解決了現(xiàn)有 encoding/json 包的很多痛點(diǎn):性能大幅提升、API 更加靈活、支持更多自定義選項(xiàng)。雖然學(xué)習(xí)成本有一定增加,但是帶來(lái)的收益是值得的。

如果能在后續(xù)版本轉(zhuǎn)正(正式落地),相信會(huì)讓很多 Gopher 的開(kāi)發(fā)體驗(yàn)有質(zhì)的提升。畢竟誰(shuí)不想告別那些繁瑣的 JSON 處理代碼呢?

參考資料

[1] JSON v2: https://github.com/golang/go/issues/71845

[2] benchmark: https://github.com/go-json-experiment/jsonbench

責(zé)任編輯:武曉燕 來(lái)源: 腦子進(jìn)煎魚(yú)了
相關(guān)推薦

2024-05-10 08:47:22

標(biāo)準(zhǔn)庫(kù)v2Go

2010-08-05 17:00:04

RIP V2協(xié)議

2010-08-06 14:07:21

RIP V2

2025-03-06 08:54:24

泛型類(lèi)型MapGo1

2023-01-09 12:41:55

模型

2021-08-18 10:39:13

Ubuntu 21.1Linux 內(nèi)核開(kāi)發(fā)人員

2023-02-03 09:10:32

大數(shù)據(jù)SeaTunnel

2012-04-24 18:10:56

華為E5

2013-04-13 13:49:35

組播IGMP V2包

2021-06-05 10:16:55

Linkerd 服務(wù)網(wǎng)格Kubernetes

2023-06-20 08:01:09

RoseDB存儲(chǔ)數(shù)據(jù)

2023-07-18 14:50:15

2009-10-12 08:21:09

ExadataOracleOPN

2025-05-20 08:00:00

Go語(yǔ)言Gin

2022-12-14 10:21:25

目標(biāo)檢測(cè)框架

2021-09-27 09:55:06

Chrome瀏覽器Manifest V2

2013-09-18 13:51:00

華為服務(wù)器華為

2013-01-08 17:30:31

Google MapsAndroid MapMapFragment

2009-08-28 11:30:36

GPL v2授權(quán)

2022-12-14 08:58:48

谷歌Chrome瀏覽器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

精品一区在线播放| 91丨九色丨蝌蚪富婆spa| 欧美www视频在线观看| 亚洲另类视频| 真实国产乱子伦精品一区二区三区| 26uuu色噜噜精品一区| 99精品视频一区| 亚洲国产精品二十页| 亚洲二区免费| 久久久国产精品| 久久久久久久免费视频了| 国产精品萝li| h片精品在线观看| 91探花在线观看| 午夜精品福利在线| 霍思燕三级露全乳照| 日韩图片一区| 国产一区私人高清影院| 亚洲日本视频在线| 亚洲午夜女主播在线直播| 欧洲不卡视频| 午夜精品在线视频一区| 久久婷五月综合| 91丨porny丨国产入口| 一卡二卡3卡四卡高清精品视频| 精品9999| 91国产在线免费观看| 欧美理论视频| 91国内揄拍国内精品对白| 欧美男女视频| 久久精品国产亚洲| 成人直播视频| 亚洲女人被黑人巨大进入| 欧洲成人综合网| 欧美一级搡bbbb搡bbbb| 91社区在线| 欧美美女视频在线观看| 国产精品影院在线| 欧美日韩国产一级| 成人在线网址| 日韩国产高清视频在线| 美女露胸视频在线观看| 亚洲欧美成人精品| 99久久er| 久久久久久亚洲精品中文字幕 | 伊人久久大香线蕉午夜av| 亚洲在线日韩| 欧美不卡三区| 日韩电影在线看| 日韩性感在线| 狠狠网亚洲精品| 久久视频这里有精品| 久久久蜜桃精品| 人善交video高清| 中文字幕亚洲区| 成人午夜天堂| 精品国产乱码久久久久久婷婷| 日本视频在线观看一区二区三区| 久久这里只有精品8| 老汉色老汉首页av亚洲| 色噜噜夜夜夜综合网| 国产一区二区色| 国产美女玉足交| 日韩美女一区二区三区在线观看| 欧美国产日本在线| 中文字幕一区二区日韩精品绯色| 欧美中文字幕在线观看视频| 白白色 亚洲乱淫| 久久久久久三级| 亚洲欧美日本韩国| 性感av在线播放| 欧美疯狂做受xxxx富婆| 蜜桃视频动漫在线播放| 中文字幕不卡在线视频极品| 中文久久电影小说| 国产日韩欧美在线观看| 国产精品视频| 少妇av一区二区三区无码| 亚洲欧美综合另类在线卡通| 青青草视频免费在线观看| 精品国产亚洲在线| 日韩视频在线直播| 成人免费视频网站| 国产精品一二三在| 天堂中文字幕| 精品成人私密视频| 高清日韩中文字幕| 不卡一区二区三区视频| 国产成人在线看| 久久.com| 亚洲成av人影院在线观看| 成人国产精品久久| 亚洲精品免费网站| 国产毛片精品视频| 日本18视频网站| 亚洲第一中文字幕| 国产99久久精品一区二区300| 日韩欧美一区二区视频在线播放 | 成人av小说网| 欧美精品在线观看播放| 福利一区和二区| 91精品国产一区二区三区动漫| 国产老肥熟一区二区三区| 在线看片黄色| 国产亚洲欧洲高清| 久久久久久久久久久妇女| 国产91视频一区| 色综合欧美在线| 欧美日韩中出| 制服诱惑一区| 色综合久久综合网97色综合| 国内精品伊人| 欧美日韩大片一区二区三区| 亚洲日本乱码在线观看| 在线看片国产福利你懂的| 亚洲a中文字幕| 国产视频不卡一区| 波多野结衣中文字幕久久| 国产综合福利在线| 久久精品视频一区| 9999热视频在线观看| 国产美女搞久久| 久久久不卡影院| 久久影院午夜精品| 国产私拍一区| 精品毛片三在线观看| 久久亚洲黄色| 日韩国产一级片| 亚洲а∨天堂久久精品喷水| 久久久久亚洲| 裸体网站视频| 欧美疯狂xxxx大交乱88av| 国产精品综合二区| freexxx性亚洲精品| 国产综合色一区二区三区| 亚洲不卡一区二区三区| 91亚洲精品视频在线观看| 精品国产一区二区三区无码| 日韩精品一区二区三区老鸭窝| 久久久久久久久久久久久久久久久久 | 国产成人无码av在线播放dvd| 亚洲精品一区二区精华| 樱桃成人精品视频在线播放| 日本电影免费看| 午夜精品一区二区三区在线播放 | 国产又粗又猛又爽又黄的网站| 欧美日韩黄色一区二区| 日韩精品电影| 国产小黄视频| 色综合久久中文字幕综合网小说| 粉嫩嫩av羞羞动漫久久久 | 亚洲一级二级在线| 韩国精品福利一区二区三区 | 99re8这里只有精品| 欧美一区三区二区| 鲁大师成人一区二区三区| 免费黄色在线观看| 九九九久久久| 精品视频全国免费看| 亚洲黄色三级| 国产一级在线| 国产自产精品| 欧美变态tickle挠乳网站| 美腿丝袜亚洲色图| 澳门成人av网| 日韩avxxx| 51色欧美片视频在线观看| 亚洲乱码国产乱码精品精可以看| 国产一区二区区别| 精品美女视频在线观看免费软件 | 亚洲精品免费在线视频| 五月婷婷综合激情| 亚洲欧美网站在线观看| 97最新国自产拍视频在线完整在线看| 国产女人水真多18毛片18精品| 欧美日韩不卡一区| 日本va欧美va欧美va精品| 日本免费久久| 狠狠热免费视频| 国产精品久久久久久久av大片| 欧美日韩在线视频首页| 国产亚洲毛片在线| 三妻四妾的电影电视剧在线观看| 女人帮男人橹视频播放| 久久福利视频网| 亚洲欧洲一区二区三区| 综合激情视频| 啊啊啊久久久| 鲁一鲁一鲁一鲁一av| 成人在线精品视频| 亚洲福利视频在线| 久久久综合网站| 久久精品久久久| 在线视频超级| 97在线观视频免费观看| 国产伦精品一区二区三区在线| 亚洲精品福利在线观看| 综合中文字幕亚洲| 久久福利一区| 国产精品17p|