1 回答

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果按值對(duì) int 進(jìn)行編碼,則對(duì)此無能為力 - 默認(rèn)值為 0。
確保在 Go 中編碼的可空性的常見方法是使用指針類型。使用 代替 a 可以區(qū)分“無”和 0。*intint
例如,使用 JSON 示例,請(qǐng)考慮以下結(jié)構(gòu):
type Options struct {
Id *string `json:"id,omitempty"`
Verbose *bool `json:"verbose,omitempty"`
Level *int `json:"level,omitempty"`
Power *int `json:"power,omitempty"`
}
這些數(shù)據(jù):
{
"id": "foobar",
"verbose": false,
"level": 10
}
請(qǐng)注意,未指定“電源”。你可以寫一個(gè)反序列化器:
func parseOptions(jsn []byte) Options {
var opts Options
if err := json.Unmarshal(jsonText, &opts); err != nil {
log.Fatal(err)
}
if opts.Power == nil {
var v int = 10
opts.Power = &v
}
return opts
}
這會(huì)將默認(rèn)值設(shè)置為“power”(如果未指定)。這使您可以區(qū)分“不存在”和“存在并且其值為0”。powerpower
如果您的編碼/ RPC機(jī)制不允許指針,則可以通過具有另一個(gè)名為“存在索引”或類似內(nèi)容的布爾字段來解決此問題。
最后,考慮設(shè)計(jì)程序,使其能夠適應(yīng)“未設(shè)置”和“設(shè)置為默認(rèn)值”之間的差異。IOW,只需接受默認(rèn)值和未指定的數(shù)據(jù)是相同的。從長(zhǎng)遠(yuǎn)來看,這將導(dǎo)致更干凈的設(shè)計(jì)和代碼,并且不易出錯(cuò)。
- 1 回答
- 0 關(guān)注
- 94 瀏覽
添加回答
舉報(bào)