1 回答

TA貢獻1797條經驗 獲得超6個贊
這個問題在xitongsys/parquet-go
issue 281中被詳細討論,建議是
使用
OPTIONAL
類型。
即使你不分配一個值(就像你的代碼),非點值也會被分配一個默認值。
所以parquet-go
不知道它是空值還是默認值。
然而:
歸結為我不能使用該
OPTIONAL
類型,換句話說,我不能將我的結構轉換為使用指針。
我曾嘗試repetitiontype=OPTIONAL
用作標簽,但這會導致一些奇怪的行為。
我希望該標簽的行為方式omitempty
與 Golang 標準庫中的標簽相同,即如果該值不存在,則不會將其放入 JSON 中。這一點很重要的原因是,如果該字段丟失或未設置,當它被編碼為鑲木地板時,則無法判斷該值是 0 還是在 int64 的情況下只是未設置。
這說明了這個問題:
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: "[email protected]",
MonthlySalary: []Salary{
{
Basic: 15000.00,
},
},
}
file, _ := json.MarshalIndent(data, "", " ")
_ = ioutil.WriteFile("test.json", file, 0o644)
}
生成的 JSON 為:
{
"Email": "[email protected]",
"Age": 0,
"MonthlySalary": [
{
"Basic": 15000
}
]
}
如您所見,結構中具有omit empty標記但未分配的項目不會出現在 JSON 中,即HRA TA.
但另一方面Age沒有這個標簽,因此它仍然包含在 JSON 中。
這是有問題的,因為當這個 golang 庫寫入時,結構中的所有字段都被分配了內存,parquet-所以如果你有一個大的結構,它只是稀疏地填充,它仍然會占用全部內存。
當再次讀取文件時,這是一個更大的問題,因為無法知道放入鑲木地板文件中的值是空值還是只是未分配。
如果我能讓你相信擁有它的價值,我很樂意幫助omitempty為這個庫實現一個標簽。
- 1 回答
- 0 關注
- 103 瀏覽
添加回答
舉報