uber-go/zap

float NaN are encoded as string "NaN"

オープン

#690 opened on 2019/03/19

 (1 件のコメント) (0 件のリアクション) (0 人の担当者)Go (1,448 件のフォーク)batch import
help wanted

Repository metrics

Stars
 (22,391 個のスター)
PR merge metrics
 (30d に merged 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.

コントリビューターガイド