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: "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
}
]
}
如您所见,结构中具有omit empty标记但未分配的项目不会出现在 JSON 中,即HRA TA.
但另一方面Age没有这个标签,因此它仍然包含在 JSON 中。
这是有问题的,因为当这个 golang 库写入时,结构中的所有字段都被分配了内存,parquet-所以如果你有一个大的结构,它只是稀疏地填充,它仍然会占用全部内存。
当再次读取文件时,这是一个更大的问题,因为无法知道放入镶木地板文件中的值是空值还是只是未分配。
如果我能让你相信拥有它的价值,我很乐意帮助omitempty为这个库实现一个标签。
- 1 回答
- 0 关注
- 72 浏览
添加回答
举报