Golang中空的切片轉(zhuǎn)化成 JSON 后變?yōu)?nbsp;null 問題的解決方案
問題
在 Golang 中,經(jīng)常需要將其他類型(例如 slice、map、struct 等類型)的數(shù)據(jù)轉(zhuǎn)化為 JSON 格式。有時候轉(zhuǎn)化的結(jié)果并不是預(yù)期中的,例如將一個空的切片轉(zhuǎn)化為 JSON 時,會變成"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)) }
運行示例看下結(jié)果:
$ go run main.go null
結(jié)果輸出的值為 “null”,而并非預(yù)期中的 “[]”。
原因
上面示例代碼中的 res 是通過 var 關(guān)鍵字來聲明為字符串類型切片的,這樣的切片稱為零值切片,其值為 nil,無指向任何內(nèi)存地址。其出現(xiàn)實標題中這種情況的切片就是零值切片,接下來介紹下零值切片和空切片。
在 Golang 中,切片是一個長度可變的數(shù)組,有三個屬性:指針、長度和容量。"零值切片"和"空切片"是兩種特殊的切片。
- 零值切片:當一個切片類型的變量被聲明但沒有被顯式初始化時,它的值就是一個零值切片。零值切片不會被分配內(nèi)存空間,長度和容量都是零,零值切片也可以說是 nil 切片。例如:
var s []string fmt.Println(s == nil) // 輸出 "true"
- 空切片:空切片的長度和容量也都是零,但是指向了一個真實的、雖然是空的,但已經(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"
在這兩個例子中,s 都是空切片,長度和容量都是零,但是值不是 nil。
零值切片和空切片在大多數(shù)情況下是可以互換使用的,都可以用來表示一個空的集合。但是如果需要區(qū)分一個切片是否被顯式初始化過,就需要注意它們的區(qū)別了。而 encoding/json 庫對兩者的處理方式就是不一樣的,會將零值切片編碼為“null”,而將空切片編碼為 “[]”。這可能會在某些情況下引發(fā)問題,例如當接口對于數(shù)組的處理期望"[]"而非"null"時。
講解到這里,相信大家已經(jīng)知道本文題目的答案了,如果將空的切片轉(zhuǎn)化為 JSON 格式后預(yù)期得到“[]”,就需要在聲明切片時,使用 make 函數(shù)或者字面量語法來創(chuàng)建切片。看個簡單的示例:
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)) }
運行代碼看下效果:
$ go run main.go []
可以看出,達到了預(yù)期的效果。
小結(jié)
本文講解了零值切片(nil 切片)和空切片的定義和差異,如果想將空的切片轉(zhuǎn)化為 JSON 格式后得到 “[]”而不是“null”,最好的方式是使用 make 函數(shù)或者字面量語法來創(chuàng)建切片。
以上就是Golang中空的切片轉(zhuǎn)化成 JSON 后變?yōu)?null 的問題的解決方案的詳細內(nèi)容,更多關(guān)于GolangJSON變?yōu)?null的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
gorm 結(jié)構(gòu)體中 binding 和 msg 結(jié)構(gòu)體標簽示例詳解
文章介紹了Gin框架中binding和msg結(jié)構(gòu)體標簽的使用,包括基本用法、常用驗證規(guī)則、自定義驗證器、錯誤信息自定義、控制器使用示例、組合驗證規(guī)則、跨字段驗證和初始化驗證器等,這些標簽主要用于數(shù)據(jù)驗證、自定義錯誤信息、參數(shù)綁定和表單驗證2024-11-11Go語言實現(xiàn)Fibonacci數(shù)列的方法
這篇文章主要介紹了Go語言實現(xiàn)Fibonacci數(shù)列的方法,實例分析了使用遞歸和不使用遞歸兩種技巧,并對算法的效率進行了對比,需要的朋友可以參考下2015-02-02golang實現(xiàn)一個簡單的websocket聊天室功能
這篇文章主要介紹了golang實現(xiàn)一個簡單的websocket聊天室功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10golang?db事務(wù)的統(tǒng)一封裝的實現(xiàn)
這篇文章主要介紹了golang db事務(wù)的統(tǒng)一封裝的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12Go基礎(chǔ)教程系列之數(shù)據(jù)類型詳細說明
這篇文章主要介紹了Go基礎(chǔ)教程系列之數(shù)據(jù)類型詳細說明,需要的朋友可以參考下2022-04-04Golang如何調(diào)用windows下的dll動態(tài)庫中的函數(shù)
這篇文章主要介紹了Golang如何調(diào)用windows下的dll動態(tài)庫中的函數(shù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05