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)實標(biāo)題中這種情況的切片就是零值切片,接下來介紹下零值切片和空切片。
在 Golang 中,切片是一個長度可變的數(shù)組,有三個屬性:指針、長度和容量。"零值切片"和"空切片"是兩種特殊的切片。
- 零值切片:當(dāng)一個切片類型的變量被聲明但沒有被顯式初始化時,它的值就是一個零值切片。零值切片不會被分配內(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ā)問題,例如當(dāng)接口對于數(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 []
可以看出,達(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的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang詳細(xì)講解常用Http庫及Gin框架的應(yīng)用
下面這篇文章主要給大家介紹了關(guān)于Golang常用的Http庫及Gin框架,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
Go語言實現(xiàn)控制臺輸入&生成隨機(jī)數(shù)詳解
這篇文章主要介紹了Go語言如何實現(xiàn)控制臺輸入&生成隨機(jī)數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例
這篇文章主要為大家介紹了Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

