php小編魚仔為您帶來關于在Go語言中如何使用非必需的JSON參數的技巧。在編寫Go程序時,我們經常需要處理JSON數據,有時候我們可能只需要使用其中的一部分參數,而不需要全部參數。本文將介紹如何在Go中使用非必需的JSON參數,讓您能夠更靈活地處理JSON數據,提高代碼的可讀性和可維護性。無論您是初學者還是有一定經驗的開發者,本文都將為您提供有用的技巧和示例代碼,幫助您更好地理解和應用這一特性。讓我們一起來探索吧!
問題內容
您好,我正在 Go 中開發 Rest API,我希望用戶傳遞 JSON 參數:
Offset int64 `json:"offset"` Limit int64 `json:"limit"` SortBy string `json:"sortby"` Asc bool `json:"asc"` Username string `json:"username"` First_Name string `json:"first_name"` Last_Name string `json:"last_name"` Status string `json:"status"`
登錄后復制
但它們并不總是必需的,例如用戶可以僅傳遞 Offset
并忽略其他。他甚至可以發送0個參數。我怎樣才能做到這一點?
解決方法
從 JSON 文本中解組值時,json
包不要求所有字段出現在 JSON 中,也不保證所有 JSON 字段都有匹配的 Go 字段。
所以你沒有什么特別的事情要做,只需將你所擁有的東西整理成 Go 值你想要或可能想要的東西即可。
需要注意的一點是,如果 JSON 文本中缺少某個字段,則 json
包不會更改相應的 Go 字段,因此如果以“新鮮”開頭,零值,該字段將保留其類型的零值。
大多數情況下,這足以檢測字段(在 JSON 中)是否存在,例如,如果在 Go 結構中您有一個 string
類型的 SortBy
字段,如果 JSON 中缺少該字段,它將保留空 string
: ""
.
如果零值是有用且有效的,那么您可以轉向使用指針。例如,如果在您的應用程序中,空 string
將是有效的 SortBy
值,您可以將此字段聲明為指針:*string
。在這種情況下,如果 JSON 文本中缺少它,它將保留 nil
,即任何指針類型的零值。
請參閱此示例:
type Data struct { I int S string P *string } func main() { var d Data var err error d, err = Data{}, nil err = json.Unmarshal([]byte(`{"I":1, "S":"sv", "P":"pv"}`), &d) fmt.Printf("%#v %v\n", d, err) d, err = Data{}, nil err = json.Unmarshal([]byte(`{"I":1}`), &d) fmt.Printf("%#v %v\n", d, err) d, err = Data{}, nil err = json.Unmarshal([]byte(`{"S":"abc"}`), &d) fmt.Printf("%#v %v\n", d, err) }
登錄后復制
輸出(在 Go Playground 上嘗試一下):
main.Data{I:1, S:"sv", P:(*string)(0x1050a150)} main.Data{I:1, S:"", P:(*string)(nil)} main.Data{I:0, S:"abc", P:(*string)(nil)}
登錄后復制