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.

贡献者指南