亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

幾周前,我在使用 Golang 微服務(wù),需要添加使用 JSON 數(shù)據(jù)的 CURP 操作的支持。通常,我會(huì)為實(shí)體創(chuàng)建一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體中定義了所有字段以及 'omitempty' 屬性,如下所示

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

問題

但是這種表示形式帶來了嚴(yán)重的問題,尤其對(duì)于 Update 或 Edit 操作而言.

例如,假設(shè)更新請(qǐng)求的 JSON 數(shù)據(jù)看起來像是這樣

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

注意為空的 desc 字段?,F(xiàn)在讓我們來看看這段請(qǐng)求數(shù)據(jù)在 Go 中解封后是怎么樣的

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

這里的描述是一個(gè)空字符串,很明顯客戶端希望將 desc 設(shè)置為空字符串,這是由我們的程序推斷出來的.

但是,如果客戶端不希望更改 Desc 的現(xiàn)有值,在這種情況下,再次發(fā)送一個(gè)描述字符串是不正確的,因此請(qǐng)求的 JSON 數(shù)據(jù)可能看起來像是這樣

{"id":"1234","name":"xyz"}

我們解封到我們的結(jié)構(gòu)體中

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

額,仍然會(huì)將 Desc 作為空字符串獲取,那么如何區(qū)分未設(shè)置字段和空字段

簡答?指針

解決辦法

受到一些現(xiàn)有 Golang 庫的啟發(fā),如?go-github. 我們可以將結(jié)構(gòu)體字段更改為指針類型,如下所示

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

通過這樣做,我們?cè)谧侄沃刑砑恿祟~外的狀態(tài)。如果原始 JSON 中不存在該字段,則結(jié)構(gòu)體字段將為空 (*nil*).

另一方面,如果該字段確實(shí)存在并且為空,則指針不為空,并且該字段包含空值.

注意?- 我沒有將 'Id' 字段更改為指針類型,因?yàn)樗痪邆淇諣顟B(tài),id 是必需的,類似數(shù)據(jù)庫中的 id.

我們?cè)賴L試一下.

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

Output

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

第一種情況,由于 desc 設(shè)置為空字符串,因此我們?cè)?Desc?獲得了一個(gè)非空指針并包含一個(gè)空字符串的值。第二種情況,該字段未設(shè)置,我們得到了一個(gè)空字符串指針.

因此我們能夠區(qū)分兩種更新。這種方式不僅適用于字符串,而且適用于其他的所有數(shù)據(jù)類型,包括整型,嵌套結(jié)構(gòu)體,等.

但是這種方法也存在一些問題.

空安全性: 非指針數(shù)據(jù)類型具備固有的空安全性。在 Golang 中這意味著字符串或整型永遠(yuǎn)不能為空。他們始終具備默認(rèn)值。但是如果定義了指針,則這些數(shù)據(jù)類型在未手動(dòng)設(shè)置的情況下默認(rèn)為空。因此,嘗試在不驗(yàn)證可空性的情況下訪問那些指針的數(shù)據(jù)可能會(huì)導(dǎo)致應(yīng)用程序崩潰.

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

通過始終檢查空指針可以很容易的解決此問題,但你的代碼可能會(huì)看起來會(huì)很啰嗦.

可打印性: 如在基于指針的解決方案的輸出中你可能已經(jīng)注意到的問題,不會(huì)打印指針的值。二十打印了指針的十六進(jìn)制值,這在應(yīng)用程序中沒什么用。這也可以通過重新使用 stringer 接口來克服.

Golang 中使用 JSON 時(shí)如何區(qū)分空字段和未設(shè)置字段?

附錄:

  • 解決上述問題的另一種方法是使用具有可為空類型的三方庫,其類型可提供檢查是否為空的方法,而無需關(guān)心指針.

原文地址:https://medium.com/@arpitkh96/differentiate-between-empty-and-not-set-fields-with-json-in-golang-957bb2c5c065

譯文地址:https://learnku.com/go/t/49332

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!