1
0
mirror of https://github.com/json-iterator/go.git synced 2025-03-20 20:54:55 +02:00

decoder/encoder;float precision doc

This commit is contained in:
Fei Ni 2017-06-11 16:28:31 +08:00
parent cdbad22d22
commit cee09816e3
3 changed files with 18 additions and 13 deletions

View File

@ -6,9 +6,9 @@
//
// "JSON and Go"
// (https://golang.org/doc/articles/json_and_go.html)
// gives a description of how Marshall/Unmarshall operate
// gives a description of how Marshal/Unmarshal operate
// between arbitrary or predefined json objects and bytes,
// and it applies to jsoniter.Marshall/Unmarshall.
// and it applies to jsoniter.Marshal/Unmarshal as well.
package jsoniter
import (

View File

@ -9,19 +9,22 @@ import (
"unsafe"
)
/*
Reflection on type to create decoders, which is then cached
Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
1. create instance of new value, for example *int will need a int to be allocated
2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
3. assignment to map, both key and value will be reflect.Value
For a simple struct binding, it will be reflect.Value free and allocation free
*/
// Don't confuse jsoniter.Decoder with json.Decoder.
// jsoniter.Decoder/Encoder are an internal types registered to cache as needed.
// For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link).
//
// Reflection on type to create decoders, which is then cached
// Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions
// 1. create instance of new value, for example *int will need a int to be allocated
// 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New
// 3. assignment to map, both key and value will be reflect.Value
// For a simple struct binding, it will be reflect.Value free and allocation free
type Decoder interface {
decode(ptr unsafe.Pointer, iter *Iterator)
}
// Don't confuse jsoniter.Encoder with json.Encoder.
// jsoniter.Decoder/Encoder are an internal types registered to cache as needed.
// For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link).
type Encoder interface {
isEmpty(ptr unsafe.Pointer) bool
encode(ptr unsafe.Pointer, stream *Stream)
@ -166,7 +169,7 @@ func CleanDecoders() {
atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
}
// CleanEncoders cleans decoders registered or cached
// CleanEncoders cleans encoders registered or cached
func CleanEncoders() {
typeEncoders = map[string]Encoder{}
fieldEncoders = map[string]Encoder{}

View File

@ -75,6 +75,8 @@ func (stream *Stream) WriteFloat64Lossy(val float64) {
}
}
// EnableLossyFloatMarshalling keeps 10**(-6) precision
// for float variables for better performance.
func EnableLossyFloatMarshalling() {
// for better performance
RegisterTypeEncoder("float32", func(ptr unsafe.Pointer, stream *Stream) {