理解並使用 Golang 的 “omitempty” 特性
在使用 Go (Golang) 並將數據編碼爲 JSON 時,您可能會遇到這樣的情況:如果某些字段的值爲空,則需要從編碼輸出中省略這些字段。這就是 Golang 的 omitempty
功能發揮作用的地方。struct 字段標記中的 omitempty
選項會告訴編碼器,如果字段爲空值,則跳過該字段。
什麼是 “Empty Value”?
在 Go 中,Empty Value
的定義是:
-
布爾類型爲 false
-
0 表示數字類型
-
指針、接口、Map、切片和 Channel 爲 nil
-
字符串類型的空字符串
使用案例
讓我們考慮一下網絡應用中的一種常見情況:您需要發送 JSON 格式的編碼數據。Go 的 JSON 處理方式可能與通常的 JSON 表示方式略有不同。
type Student struct {
Name string `json:"name"`
Age int `json:"age"`
}
需要初始化一個學生對象並將其編碼爲 JSON:
student := Student{
Name: "Denny",
Age: 17,
}
jsonData, _ := json.Marshal(student)
fmt.Println(string(jsonData))
輸出結果是:
{"name":"Denny","age":17}
這可以達到預期效果。但如果學生的年齡未知呢?
student := Student{
Name: "Denny",
}
jsonData, _ := json.Marshal(student)
fmt.Println(string(jsonData))
在這種情況下輸出結果將是:
{"name":"Denny","age":0}
使用 “omitempty” 處理未知的值
在上面的示例中,年齡字段被設置爲默認值 0,這看起來並不合理,因爲它可能會產生誤導。要避免這種情況,可以使用 omitempty
標籤:
type Student struct {
Name string `json:"name"`
Age int `json:"age,omitempty"`
}
現在,如果沒有提供年齡或年齡設置爲 0,JSON 輸出中將忽略年齡字段:
student := Student{
Name: "Denny",
}
jsonData, _ := json.Marshal(student)
fmt.Println(string(jsonData))
輸出結果是:
{"name":"Denny"}
使用 Omitempty 標記後,如果年齡字段設置爲零值(整數爲 0),則不會包含在 JSON 輸出中。
總結
Golang 中的 omitempty 標籤是 JSON 編碼的一個強大功能。它能確保編碼輸出中不包含空值字段,從而防止誤導性數據表示並減小 JSON 有效載荷的大小。在需要發送準確的 JSON 響應的網絡應用程序和應用程序接口中,該功能尤其有用。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/5rRVmx0WBjfEScWy_XbHjQ