互换的青春
这个问题在xitongsys/parquet-goissue 281中被详细讨论,建议是使用OPTIONAL类型。即使你不分配一个值(就像你的代码),非点值也会被分配一个默认值。所以parquet-go不知道它是空值还是默认值。然而:归结为我不能使用该OPTIONAL类型,换句话说,我不能将我的结构转换为使用指针。我曾尝试repetitiontype=OPTIONAL用作标签,但这会导致一些奇怪的行为。我希望该标签的行为方式omitempty与 Golang 标准库中的标签相同,即如果该值不存在,则不会将其放入 JSON 中。这一点很重要的原因是,如果该字段丢失或未设置,当它被编码为镶木地板时,则无法判断该值是 0 还是在 int64 的情况下只是未设置。这说明了这个问题:package mainimport ( "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为这个库实现一个标签。