亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang中空的切片轉(zhuǎn)化成 JSON 后變?yōu)?nbsp;null 問題的解決方案

 更新時(shí)間:2023年09月24日 10:02:04   作者:路多辛  
在 Golang 中,經(jīng)常需要將其他類型(例如 slice、map、struct 等類型)的數(shù)據(jù)轉(zhuǎn)化為 JSON 格式,有時(shí)候轉(zhuǎn)化的結(jié)果并不是預(yù)期中的,例如將一個(gè)空的切片轉(zhuǎn)化為 JSON 時(shí),會(huì)變成"null",所以本文將給大家介紹一下解決方法,需要的朋友可以參考下

問題

在 Golang 中,經(jīng)常需要將其他類型(例如 slice、map、struct 等類型)的數(shù)據(jù)轉(zhuǎn)化為 JSON 格式。有時(shí)候轉(zhuǎn)化的結(jié)果并不是預(yù)期中的,例如將一個(gè)空的切片轉(zhuǎn)化為 JSON 時(shí),會(huì)變成"null",而并非預(yù)期的"[]"。示例代碼如下:

package main
import (
	"encoding/json"
	"fmt"
)
func main() {
	var res []string
	b, err := json.Marshal(res)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(b))
}

運(yùn)行示例看下結(jié)果:

$ go run main.go
null

結(jié)果輸出的值為 “null”,而并非預(yù)期中的 “[]”。

原因

上面示例代碼中的 res 是通過 var 關(guān)鍵字來聲明為字符串類型切片的,這樣的切片稱為零值切片,其值為 nil,無指向任何內(nèi)存地址。其出現(xiàn)實(shí)標(biāo)題中這種情況的切片就是零值切片,接下來介紹下零值切片和空切片。

在 Golang 中,切片是一個(gè)長(zhǎng)度可變的數(shù)組,有三個(gè)屬性:指針、長(zhǎng)度和容量。"零值切片"和"空切片"是兩種特殊的切片。

  1. 零值切片:當(dāng)一個(gè)切片類型的變量被聲明但沒有被顯式初始化時(shí),它的值就是一個(gè)零值切片。零值切片不會(huì)被分配內(nèi)存空間,長(zhǎng)度和容量都是零,零值切片也可以說是 nil 切片。例如:
var s []string
fmt.Println(s == nil)  // 輸出 "true"
  • 空切片:空切片的長(zhǎng)度和容量也都是零,但是指向了一個(gè)真實(shí)的、雖然是空的,但已經(jīng)分配了內(nèi)存的數(shù)組??涨衅梢酝ㄟ^ make 函數(shù)或者字面量語法來創(chuàng)建。例如:
s := make([]string, 0)
fmt.Println(s == nil)  // 輸出 "false"
s := []string{}
fmt.Println(s == nil)  // 輸出 "false"

在這兩個(gè)例子中,s 都是空切片,長(zhǎng)度和容量都是零,但是值不是 nil。

零值切片和空切片在大多數(shù)情況下是可以互換使用的,都可以用來表示一個(gè)空的集合。但是如果需要區(qū)分一個(gè)切片是否被顯式初始化過,就需要注意它們的區(qū)別了。而 encoding/json 庫(kù)對(duì)兩者的處理方式就是不一樣的,會(huì)將零值切片編碼為“null”,而將空切片編碼為 “[]”。這可能會(huì)在某些情況下引發(fā)問題,例如當(dāng)接口對(duì)于數(shù)組的處理期望"[]"而非"null"時(shí)。

講解到這里,相信大家已經(jīng)知道本文題目的答案了,如果將空的切片轉(zhuǎn)化為 JSON 格式后預(yù)期得到“[]”,就需要在聲明切片時(shí),使用 make 函數(shù)或者字面量語法來創(chuàng)建切片??磦€(gè)簡(jiǎn)單的示例:

package main
import (
	"encoding/json"
	"fmt"
)
func main() {
	res := make([]string, 0)
	// 或者 res:= []string{}
	// 而非 var res []string
	b, err := json.Marshal(res)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(b))
}

運(yùn)行代碼看下效果:

$ go run main.go
[]

可以看出,達(dá)到了預(yù)期的效果。

小結(jié)

本文講解了零值切片(nil 切片)和空切片的定義和差異,如果想將空的切片轉(zhuǎn)化為 JSON 格式后得到 “[]”而不是“null”,最好的方式是使用 make 函數(shù)或者字面量語法來創(chuàng)建切片。

以上就是Golang中空的切片轉(zhuǎn)化成 JSON 后變?yōu)?null 的問題的解決方案的詳細(xì)內(nèi)容,更多關(guān)于GolangJSON變?yōu)?null的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • gorm 結(jié)構(gòu)體中 binding 和 msg 結(jié)構(gòu)體標(biāo)簽示例詳解

    gorm 結(jié)構(gòu)體中 binding 和 msg 結(jié)構(gòu)體標(biāo)簽示例詳解

    文章介紹了Gin框架中binding和msg結(jié)構(gòu)體標(biāo)簽的使用,包括基本用法、常用驗(yàn)證規(guī)則、自定義驗(yàn)證器、錯(cuò)誤信息自定義、控制器使用示例、組合驗(yàn)證規(guī)則、跨字段驗(yàn)證和初始化驗(yàn)證器等,這些標(biāo)簽主要用于數(shù)據(jù)驗(yàn)證、自定義錯(cuò)誤信息、參數(shù)綁定和表單驗(yàn)證
    2024-11-11
  • Go語言實(shí)現(xiàn)Fibonacci數(shù)列的方法

    Go語言實(shí)現(xiàn)Fibonacci數(shù)列的方法

    這篇文章主要介紹了Go語言實(shí)現(xiàn)Fibonacci數(shù)列的方法,實(shí)例分析了使用遞歸和不使用遞歸兩種技巧,并對(duì)算法的效率進(jìn)行了對(duì)比,需要的朋友可以參考下
    2015-02-02
  • GO語言基礎(chǔ)入門第一個(gè)go程序解讀

    GO語言基礎(chǔ)入門第一個(gè)go程序解讀

    這篇文章主要為大家介紹了GO語言基礎(chǔ)入門的第一個(gè)go程序解讀,下面來帶大家進(jìn)入Go語言世界helloworld的大門吧,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • golang實(shí)現(xiàn)一個(gè)簡(jiǎn)單的websocket聊天室功能

    golang實(shí)現(xiàn)一個(gè)簡(jiǎn)單的websocket聊天室功能

    這篇文章主要介紹了golang實(shí)現(xiàn)一個(gè)簡(jiǎn)單的websocket聊天室功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • golang?db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn)

    golang?db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn)

    這篇文章主要介紹了golang db事務(wù)的統(tǒng)一封裝的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go基礎(chǔ)教程系列之?dāng)?shù)據(jù)類型詳細(xì)說明

    Go基礎(chǔ)教程系列之?dāng)?shù)據(jù)類型詳細(xì)說明

    這篇文章主要介紹了Go基礎(chǔ)教程系列之?dāng)?shù)據(jù)類型詳細(xì)說明,需要的朋友可以參考下
    2022-04-04
  • Golang如何調(diào)用windows下的dll動(dòng)態(tài)庫(kù)中的函數(shù)

    Golang如何調(diào)用windows下的dll動(dòng)態(tài)庫(kù)中的函數(shù)

    這篇文章主要介紹了Golang如何調(diào)用windows下的dll動(dòng)態(tài)庫(kù)中的函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • GoLang中Json?Tag用法實(shí)例總結(jié)

    GoLang中Json?Tag用法實(shí)例總結(jié)

    這篇文章主要給大家介紹了關(guān)于GoLang中Json?Tag用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • 阿里云go開發(fā)環(huán)境搭建過程

    阿里云go開發(fā)環(huán)境搭建過程

    這篇文章主要介紹了阿里云go開發(fā)環(huán)境搭建過程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Go語言中兩個(gè)比較流行的緩存庫(kù)使用示例

    Go語言中兩個(gè)比較流行的緩存庫(kù)使用示例

    緩存是計(jì)算機(jī)科學(xué)中的一個(gè)重要概念,設(shè)想某個(gè)組件需要訪問外部資源,它向外部源請(qǐng)求資源,接收并使用資源,這些步驟都需要花費(fèi)時(shí)間,下面這篇文章主要給大家介紹了關(guān)于Go語言中兩個(gè)比較流行的緩存庫(kù)使用的相關(guān)資料,需要的朋友可以參考下
    2024-04-04

最新評(píng)論