Skip to content

Commit d518460

Browse files
authored
Update go-tips.cn.md
1 parent a17acaf commit d518460

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

go-tips.cn.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,52 @@ should.Equal("1000001", string(output))
217217
如果要自定义的话,参见 `RegisterTimeAsInt64Codec` 的实现代码
218218

219219
# 使用 MarshalText支持非字符串作为key的map
220+
221+
虽然 JSON 标准里只支持 string 作为 key 的 map。但是 golang 通过 MarshalText() 接口,使得其他类型也可以作为 map 的 key。例如
222+
223+
```golang
224+
f, _, _ := big.ParseFloat("1", 10, 64, big.ToZero)
225+
val := map[*big.Float]string{f: "2"}
226+
str, err := MarshalToString(val)
227+
should.Equal(`{"1":"2"}`, str)
228+
```
229+
230+
其中 `big.Float` 就实现了 MarshalText()
231+
220232
# 使用 json.RawMessage
233+
234+
如果部分json文档没有标准格式,我们可以把原始的文本信息用string保存下来。
235+
236+
```golang
237+
type TestObject struct {
238+
Field1 string
239+
Field2 json.RawMessage
240+
}
241+
var data TestObject
242+
json.Unmarshal([]byte(`{"field1": "hello", "field2": [1,2,3]}`), &data)
243+
should.Equal(` [1,2,3]`, string(data.Field2))
244+
```
245+
221246
# 使用 json.Number
247+
248+
默认情况下,如果是 interface{} 对应数字的情况会是 float64 类型的。如果输入的数字比较大,这个表示会有损精度。所以可以 `UseNumber()` 启用 `json.Number` 来用字符串表示数字。
249+
250+
```golang
251+
decoder1 := json.NewDecoder(bytes.NewBufferString(`123`))
252+
decoder1.UseNumber()
253+
var obj1 interface{}
254+
decoder1.Decode(&obj1)
255+
should.Equal(json.Number("123"), obj1)
256+
```
257+
258+
jsoniter 支持标准库的这个用法。同时,扩展了行为使得 Unmarshal 也可以支持 UseNumber 了。
259+
260+
```golang
261+
json := Config{UseNumber:true}.Froze()
262+
var obj interface{}
263+
json.UnmarshalFromString("123", &obj)
264+
should.Equal(json.Number("123"), obj)
265+
```
266+
222267
# 统一更改字段的命名风格
223268
# 使用私有的字段

0 commit comments

Comments
 (0)