第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Go 在轉(zhuǎn)換為 JSON 之前如何處理 float infinity

Go 在轉(zhuǎn)換為 JSON 之前如何處理 float infinity

Go
一只斗牛犬 2023-03-07 13:27:16
我遇到過(guò)這樣一種情況,我有一些可能是無(wú)窮大/NaN 的 float64 字段,并且嘗試編組到 JSON 會(huì)導(dǎo)致有關(guān)不支持 +Inf 類型的錯(cuò)誤。type Something interface {  Id string `firestore:"id"`  NumberA float64 `firestore:"numberA"`  NumberB float64 `firestore:"numberB"`  NumberC float64 `firestore:"numberC"`}該結(jié)構(gòu)最初是通過(guò)另一個(gè)庫(kù) (Google Firestore) 填充的。實(shí)際上,這個(gè)結(jié)構(gòu)要大得多,有更多的浮動(dòng)字段。我想我可以使用類似下面這個(gè)循環(huán)的東西,使用反射來(lái)找到它們,盡管我想知道是否有更簡(jiǎn)潔的方法或更慣用的方法。v := reflect.ValueOf(structVar)typeOfS := v.Type()for i := 0; i< v.NumField(); i++ {  if typeOfS.Field(i).Type.Kind() == reflect.Float64 && math.IsInf(v.Field(i).Interface().(float64), 1) {    // ... some logic I'll put here  }}我不明白如何實(shí)現(xiàn)自定義編組,所以也許這可能是處理 +Inf 的一個(gè)選項(xiàng)?
查看完整描述

2 回答

?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊

值的自定義處理可以通過(guò)實(shí)現(xiàn)接口的自定義類型來(lái)完成Marshaler。Something但是,您的類型格式不正確。它被定義為type Something interface{},而實(shí)際上應(yīng)該是type Something struct:


type Something struct {

    Id      string    `firestore:"id"`

    NumberA JSONFloat `firestore:"numberA"`

    NumberB JSONFloat `firestore:"numberB"`

    NumberC JSONFloat `firestore:"numberC"`

}


type JSONFloat float64


func (j JSONFloat) MarshalJSON() ([]byte, error) {

    v := float64(j)

    if math.IsInf(j, 0) {

        // handle infinity, assign desired value to v

        // or say +/- indicates infinity

        s := "+"

        if math.IsInf(v, -1) {

            s = "-"

        }

        return []byte(s), nil

    }

    return json.Marshal(v) // marshal result as standard float64

}


func (j *JSONFloat) UnsmarshalJSON(v []byte) error {

    if s := string(v); s == "+" || s == "-" {

        // if +/- indiciates infinity

        if s == "+" {

            *j = JSONFloat(math.Inf(1))

            return nil

        }

        *j = JSONFloat(math.Inf(-1))

        return nil

    }

    // just a regular float value

    var fv float64

    if err := json.Unmarshal(v, &fv); err != nil {\

        return err

    }

    *j = JSONFloat(fv)

    return nil

}

應(yīng)該這樣做


查看完整回答
反對(duì) 回復(fù) 2023-03-07
?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊

我創(chuàng)建了xhhuango/json來(lái)支持 NaN、+Inf 和 -Inf。

type T struct {

    N  float64

    IP float64

    IN float64

}


func TestMarshalNaNAndInf(t *testing.T) {

    s := T{

        N:  math.NaN(),

        IP: math.Inf(1),

        IN: math.Inf(-1),

    }

    got, err := Marshal(s)

    if err != nil {

        t.Errorf("Marshal() error: %v", err)

    }

    want := `{"N":NaN,"IP":+Inf,"IN":-Inf}`

    if string(got) != want {

        t.Errorf("Marshal() = %s, want %s", got, want)

    }

}


func TestUnmarshalNaNAndInf(t *testing.T) {

    data := []byte(`{"N":NaN,"IP":+Inf,"IN":-Inf}`)

    var s T

    err := Unmarshal(data, &s)

    if err != nil {

        t.Fatalf("Unmarshal: %v", err)

    }

    if !math.IsNaN(s.N) || !math.IsInf(s.IP, 1) || !math.IsInf(s.IN, -1)     {

        t.Fatalf("after Unmarshal, s.N=%f, s.IP=%f, s.IN=%f, want NaN, +Inf, -Inf", s.N, s.IP, s.IN)

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-03-07
  • 2 回答
  • 0 關(guān)注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)