uber-go/zap

float NaN are encoded as string "NaN"

Aperta

#690 aperta il 19 mar 2019

 (1 commento) (0 reazioni) (0 assegnatari)Go (1448 fork)batch import
help wanted

Metriche repository

Star
 (22.391 stelle)
Metriche merge PR
 (Nessuna PR mergiata in 30 g)

Descrizione

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.

Guida contributor