在 GO 中写入镶木地板时如何处理 NaN 值?

我正在尝试写入 GO 中的镶木地板文件。在写入此文件时,我可以获得NaN值。由于NaN既没有在原始类型中定义也没有在逻辑类型中定义那么我如何在 GO 中处理这个值?是否有任何现有模式适用于它?

我正在使用此处的 parquet GO 库。您可以在此处使用此库找到使用 JSON 模式写入镶木地板的代码示例。


料青山看我应如是
浏览 74回答 1
1回答

互换的青春

这个问题在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为这个库实现一个标签。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go