亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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: "[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為這個庫實現一個標簽。



查看完整回答
反對 回復 2022-12-26
  • 1 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號