uber-go/zap

float NaN are encoded as string "NaN"

開放

#690 建立於 2019年3月19日

 (1 則留言) (0 個反應) (0 位負責人)Go (1,448 個分叉)batch import
help wanted

倉庫指標

星標
 (22,391 顆星)
PR 合併指標
 (30 天內沒有已合併 PR)

描述

float NaN, +Inf, -Inf are encoded as corresponding string, which is inconsistent with json.Marshal in golang stdlib. json.Marshal will return error if float value can not be encoded in json. For the following code

type C struct {
    Field float64 `json:"field"`
}

func (c C) MarshalLogObject(enc zapcore.ObjectEncoder) error {
    enc.AddFloat64("field", c.Field)
    return nil
}

c := C{
    Field: math.NaN(),
}
logger.Error("reflection", zap.Reflect("c", c))
logger.Error("marshall", zap.Object("c", c))

The two logging statement will output different values

{"msg":"reflection","cError":"json: unsupported value: NaN"}
{"msg":"marshall","c":{"field":"NaN"}}

Output string for float value is undesired, since they are different types.

貢獻者指南