1 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
這個(gè)問題在xitongsys/parquet-go
issue 281中被詳細(xì)討論,建議是
使用
OPTIONAL
類型。
即使你不分配一個(gè)值(就像你的代碼),非點(diǎn)值也會(huì)被分配一個(gè)默認(rèn)值。
所以parquet-go
不知道它是空值還是默認(rèn)值。
然而:
歸結(jié)為我不能使用該
OPTIONAL
類型,換句話說,我不能將我的結(jié)構(gòu)轉(zhuǎn)換為使用指針。
我曾嘗試repetitiontype=OPTIONAL
用作標(biāo)簽,但這會(huì)導(dǎo)致一些奇怪的行為。
我希望該標(biāo)簽的行為方式omitempty
與 Golang 標(biāo)準(zhǔn)庫中的標(biāo)簽相同,即如果該值不存在,則不會(huì)將其放入 JSON 中。這一點(diǎn)很重要的原因是,如果該字段丟失或未設(shè)置,當(dāng)它被編碼為鑲木地板時(shí),則無法判斷該值是 0 還是在 int64 的情況下只是未設(shè)置。
這說明了這個(gè)問題:
package main
import (
"encoding/json"
"io/ioutil"
)
type Salary struct {
Basic, HRA, TA float64 `json:",omitempty"`
}
type Employee struct {
FirstName, LastName, Email string `json:",omitempty"`
Age int
MonthlySalary []Salary `json:",omitempty"`
}
func main() {
data := Employee{
Email: "mark@gmail.com",
MonthlySalary: []Salary{
{
Basic: 15000.00,
},
},
}
file, _ := json.MarshalIndent(data, "", " ")
_ = ioutil.WriteFile("test.json", file, 0o644)
}
生成的 JSON 為:
{
"Email": "mark@gmail.com",
"Age": 0,
"MonthlySalary": [
{
"Basic": 15000
}
]
}
如您所見,結(jié)構(gòu)中具有omit empty標(biāo)記但未分配的項(xiàng)目不會(huì)出現(xiàn)在 JSON 中,即HRA TA.
但另一方面Age沒有這個(gè)標(biāo)簽,因此它仍然包含在 JSON 中。
這是有問題的,因?yàn)楫?dāng)這個(gè) golang 庫寫入時(shí),結(jié)構(gòu)中的所有字段都被分配了內(nèi)存,parquet-所以如果你有一個(gè)大的結(jié)構(gòu),它只是稀疏地填充,它仍然會(huì)占用全部?jī)?nèi)存。
當(dāng)再次讀取文件時(shí),這是一個(gè)更大的問題,因?yàn)闊o法知道放入鑲木地板文件中的值是空值還是只是未分配。
如果我能讓你相信擁有它的價(jià)值,我很樂意幫助omitempty為這個(gè)庫實(shí)現(xiàn)一個(gè)標(biāo)簽。
- 1 回答
- 0 關(guān)注
- 94 瀏覽
添加回答
舉報(bào)