php小編魚仔為您帶來關(guān)于在Go語言中如何使用非必需的JSON參數(shù)的技巧。在編寫Go程序時(shí),我們經(jīng)常需要處理JSON數(shù)據(jù),有時(shí)候我們可能只需要使用其中的一部分參數(shù),而不需要全部參數(shù)。本文將介紹如何在Go中使用非必需的JSON參數(shù),讓您能夠更靈活地處理JSON數(shù)據(jù),提高代碼的可讀性和可維護(hù)性。無論您是初學(xué)者還是有一定經(jīng)驗(yàn)的開發(fā)者,本文都將為您提供有用的技巧和示例代碼,幫助您更好地理解和應(yīng)用這一特性。讓我們一起來探索吧!
問題內(nèi)容
您好,我正在 Go 中開發(fā) Rest API,我希望用戶傳遞 JSON 參數(shù):
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"`
登錄后復(fù)制
但它們并不總是必需的,例如用戶可以僅傳遞 Offset
并忽略其他。他甚至可以發(fā)送0個(gè)參數(shù)。我怎樣才能做到這一點(diǎn)?
解決方法
從 JSON 文本中解組值時(shí),json
包不要求所有字段出現(xiàn)在 JSON 中,也不保證所有 JSON 字段都有匹配的 Go 字段。
所以你沒有什么特別的事情要做,只需將你所擁有的東西整理成 Go 值你想要或可能想要的東西即可。
需要注意的一點(diǎn)是,如果 JSON 文本中缺少某個(gè)字段,則 json
包不會(huì)更改相應(yīng)的 Go 字段,因此如果以“新鮮”開頭,零值,該字段將保留其類型的零值。
大多數(shù)情況下,這足以檢測(cè)字段(在 JSON 中)是否存在,例如,如果在 Go 結(jié)構(gòu)中您有一個(gè) string
類型的 SortBy
字段,如果 JSON 中缺少該字段,它將保留空 string
: ""
.
如果零值是有用且有效的,那么您可以轉(zhuǎn)向使用指針。例如,如果在您的應(yīng)用程序中,空 string
將是有效的 SortBy
值,您可以將此字段聲明為指針:*string
。在這種情況下,如果 JSON 文本中缺少它,它將保留 nil
,即任何指針類型的零值。
請(qǐng)參閱此示例:
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) }
登錄后復(fù)制
輸出(在 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)}
登錄后復(fù)制