为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
料青山看我应如是 2022-12-26 10:28:44
我正在尝试写入 GO 中的镶木地板文件。在写入此文件时,我可以获得NaN值。由于NaN既没有在原始类型中定义也没有在逻辑类型中定义那么我如何在 GO 中处理这个值?是否有任何现有模式适用于它?我正在使用此处的 parquet GO 库。您可以在此处使用此库找到使用 JSON 模式写入镶木地板的代码示例。
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

这个问题在xitongsys/parquet-goissue 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为这个库实现一个标签。



查看完整回答
反对 回复 2022-12-26
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信