jsoniter_reflect.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "errors"
  5. "fmt"
  6. "unsafe"
  7. "sync/atomic"
  8. "strings"
  9. "io"
  10. )
  11. type Decoder interface {
  12. decode(ptr unsafe.Pointer, iter *Iterator)
  13. }
  14. type stringDecoder struct {
  15. }
  16. func (decoder *stringDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  17. *((*string)(ptr)) = iter.ReadString()
  18. }
  19. type intDecoder struct {
  20. }
  21. func (decoder *intDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  22. *((*int)(ptr)) = iter.ReadInt()
  23. }
  24. type int8Decoder struct {
  25. }
  26. func (decoder *int8Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  27. *((*int8)(ptr)) = iter.ReadInt8()
  28. }
  29. type int16Decoder struct {
  30. }
  31. func (decoder *int16Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  32. *((*int16)(ptr)) = iter.ReadInt16()
  33. }
  34. type int32Decoder struct {
  35. }
  36. func (decoder *int32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  37. *((*int32)(ptr)) = iter.ReadInt32()
  38. }
  39. type int64Decoder struct {
  40. }
  41. func (decoder *int64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  42. *((*int64)(ptr)) = iter.ReadInt64()
  43. }
  44. type uintDecoder struct {
  45. }
  46. func (decoder *uintDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  47. *((*uint)(ptr)) = iter.ReadUint()
  48. }
  49. type uint8Decoder struct {
  50. }
  51. func (decoder *uint8Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  52. *((*uint8)(ptr)) = iter.ReadUint8()
  53. }
  54. type uint16Decoder struct {
  55. }
  56. func (decoder *uint16Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  57. *((*uint16)(ptr)) = iter.ReadUint16()
  58. }
  59. type uint32Decoder struct {
  60. }
  61. func (decoder *uint32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  62. *((*uint32)(ptr)) = iter.ReadUint32()
  63. }
  64. type uint64Decoder struct {
  65. }
  66. func (decoder *uint64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  67. *((*uint64)(ptr)) = iter.ReadUint64()
  68. }
  69. type float32Decoder struct {
  70. }
  71. func (decoder *float32Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  72. *((*float32)(ptr)) = iter.ReadFloat32()
  73. }
  74. type float64Decoder struct {
  75. }
  76. func (decoder *float64Decoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  77. *((*float64)(ptr)) = iter.ReadFloat64()
  78. }
  79. type boolDecoder struct {
  80. }
  81. func (decoder *boolDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  82. *((*bool)(ptr)) = iter.ReadBool()
  83. }
  84. type stringNumberDecoder struct {
  85. elemDecoder Decoder
  86. }
  87. func (decoder *stringNumberDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  88. c := iter.readByte()
  89. if c != '"' {
  90. iter.ReportError("stringNumberDecoder", `expect "`)
  91. return
  92. }
  93. decoder.elemDecoder.decode(ptr, iter)
  94. if iter.Error != nil {
  95. return
  96. }
  97. c = iter.readByte()
  98. if c != '"' {
  99. iter.ReportError("stringNumberDecoder", `expect "`)
  100. return
  101. }
  102. }
  103. type optionalDecoder struct {
  104. valueType reflect.Type
  105. valueDecoder Decoder
  106. }
  107. func (decoder *optionalDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  108. if iter.ReadNull() {
  109. *((*unsafe.Pointer)(ptr)) = nil
  110. } else {
  111. value := reflect.New(decoder.valueType)
  112. decoder.valueDecoder.decode(unsafe.Pointer(value.Pointer()), iter)
  113. *((*uintptr)(ptr)) = value.Pointer()
  114. }
  115. }
  116. type structDecoder struct {
  117. type_ reflect.Type
  118. fields map[string]Decoder
  119. }
  120. func (decoder *structDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  121. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  122. fieldDecoder := decoder.fields[field]
  123. if fieldDecoder == nil {
  124. iter.Skip()
  125. } else {
  126. fieldDecoder.decode(ptr, iter)
  127. }
  128. }
  129. if iter.Error != nil && iter.Error != io.EOF {
  130. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  131. }
  132. }
  133. type skipDecoder struct {
  134. type_ reflect.Type
  135. }
  136. func (decoder *skipDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  137. iter.Skip()
  138. if iter.Error != nil && iter.Error != io.EOF {
  139. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  140. }
  141. }
  142. type oneFieldStructDecoder struct {
  143. type_ reflect.Type
  144. fieldName string
  145. fieldDecoder Decoder
  146. }
  147. func (decoder *oneFieldStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  148. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  149. if field == decoder.fieldName {
  150. decoder.fieldDecoder.decode(ptr, iter)
  151. } else {
  152. iter.Skip()
  153. }
  154. }
  155. if iter.Error != nil && iter.Error != io.EOF {
  156. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  157. }
  158. }
  159. type twoFieldsStructDecoder struct {
  160. type_ reflect.Type
  161. fieldName1 string
  162. fieldDecoder1 Decoder
  163. fieldName2 string
  164. fieldDecoder2 Decoder
  165. }
  166. func (decoder *twoFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  167. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  168. switch field {
  169. case decoder.fieldName1:
  170. decoder.fieldDecoder1.decode(ptr, iter)
  171. case decoder.fieldName2:
  172. decoder.fieldDecoder2.decode(ptr, iter)
  173. default:
  174. iter.Skip()
  175. }
  176. }
  177. if iter.Error != nil && iter.Error != io.EOF {
  178. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  179. }
  180. }
  181. type threeFieldsStructDecoder struct {
  182. type_ reflect.Type
  183. fieldName1 string
  184. fieldDecoder1 Decoder
  185. fieldName2 string
  186. fieldDecoder2 Decoder
  187. fieldName3 string
  188. fieldDecoder3 Decoder
  189. }
  190. func (decoder *threeFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  191. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  192. switch field {
  193. case decoder.fieldName1:
  194. decoder.fieldDecoder1.decode(ptr, iter)
  195. case decoder.fieldName2:
  196. decoder.fieldDecoder2.decode(ptr, iter)
  197. case decoder.fieldName3:
  198. decoder.fieldDecoder3.decode(ptr, iter)
  199. default:
  200. iter.Skip()
  201. }
  202. }
  203. if iter.Error != nil && iter.Error != io.EOF {
  204. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  205. }
  206. }
  207. type fourFieldsStructDecoder struct {
  208. type_ reflect.Type
  209. fieldName1 string
  210. fieldDecoder1 Decoder
  211. fieldName2 string
  212. fieldDecoder2 Decoder
  213. fieldName3 string
  214. fieldDecoder3 Decoder
  215. fieldName4 string
  216. fieldDecoder4 Decoder
  217. }
  218. func (decoder *fourFieldsStructDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  219. for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
  220. switch field {
  221. case decoder.fieldName1:
  222. decoder.fieldDecoder1.decode(ptr, iter)
  223. case decoder.fieldName2:
  224. decoder.fieldDecoder2.decode(ptr, iter)
  225. case decoder.fieldName3:
  226. decoder.fieldDecoder3.decode(ptr, iter)
  227. case decoder.fieldName4:
  228. decoder.fieldDecoder4.decode(ptr, iter)
  229. default:
  230. iter.Skip()
  231. }
  232. }
  233. if iter.Error != nil && iter.Error != io.EOF {
  234. iter.Error = fmt.Errorf("%v: %s", decoder.type_, iter.Error.Error())
  235. }
  236. }
  237. type structFieldDecoder struct {
  238. field *reflect.StructField
  239. fieldDecoder Decoder
  240. }
  241. func (decoder *structFieldDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  242. fieldPtr := uintptr(ptr) + decoder.field.Offset
  243. decoder.fieldDecoder.decode(unsafe.Pointer(fieldPtr), iter)
  244. if iter.Error != nil && iter.Error != io.EOF {
  245. iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
  246. }
  247. }
  248. type sliceDecoder struct {
  249. sliceType reflect.Type
  250. elemType reflect.Type
  251. elemDecoder Decoder
  252. }
  253. // sliceHeader is a safe version of SliceHeader used within this package.
  254. type sliceHeader struct {
  255. Data unsafe.Pointer
  256. Len int
  257. Cap int
  258. }
  259. func (decoder *sliceDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  260. decoder.doDecode(ptr, iter)
  261. if iter.Error != nil && iter.Error != io.EOF {
  262. iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error())
  263. }
  264. }
  265. func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) {
  266. slice := (*sliceHeader)(ptr)
  267. reuseSlice(slice, decoder.sliceType, 4)
  268. if !iter.ReadArray() {
  269. return
  270. }
  271. offset := uintptr(0)
  272. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  273. if !iter.ReadArray() {
  274. slice.Len = 1
  275. return
  276. }
  277. offset += decoder.elemType.Size()
  278. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  279. if !iter.ReadArray() {
  280. slice.Len = 2
  281. return
  282. }
  283. offset += decoder.elemType.Size()
  284. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  285. if !iter.ReadArray() {
  286. slice.Len = 3
  287. return
  288. }
  289. offset += decoder.elemType.Size()
  290. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  291. slice.Len = 4
  292. for iter.ReadArray() {
  293. growOne(slice, decoder.sliceType, decoder.elemType)
  294. offset += decoder.elemType.Size()
  295. decoder.elemDecoder.decode(unsafe.Pointer(uintptr(slice.Data) + offset), iter)
  296. }
  297. }
  298. // grow grows the slice s so that it can hold extra more values, allocating
  299. // more capacity if needed. It also returns the old and new slice lengths.
  300. func growOne(slice *sliceHeader, sliceType reflect.Type, elementType reflect.Type) {
  301. newLen := slice.Len + 1
  302. if newLen <= slice.Cap {
  303. slice.Len = newLen
  304. return
  305. }
  306. newCap := slice.Cap
  307. if newCap == 0 {
  308. newCap = 1
  309. } else {
  310. for newCap < newLen {
  311. if slice.Len < 1024 {
  312. newCap += newCap
  313. } else {
  314. newCap += newCap / 4
  315. }
  316. }
  317. }
  318. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, newLen, newCap).Pointer())
  319. originalBytesCount := uintptr(slice.Len) * elementType.Size()
  320. srcPtr := (*[1 << 30]byte)(slice.Data)
  321. dstPtr := (*[1 << 30]byte)(dst)
  322. for i := uintptr(0); i < originalBytesCount; i++ {
  323. dstPtr[i] = srcPtr[i]
  324. }
  325. slice.Len = newLen
  326. slice.Cap = newCap
  327. slice.Data = dst
  328. }
  329. func reuseSlice(slice *sliceHeader, sliceType reflect.Type, expectedCap int) {
  330. if expectedCap <= slice.Cap {
  331. return
  332. }
  333. dst := unsafe.Pointer(reflect.MakeSlice(sliceType, 0, expectedCap).Pointer())
  334. slice.Cap = expectedCap
  335. slice.Data = dst
  336. }
  337. var DECODERS unsafe.Pointer
  338. func addDecoderToCache(cacheKey string, decoder Decoder) {
  339. retry := true
  340. for retry {
  341. ptr := atomic.LoadPointer(&DECODERS)
  342. cache := *(*map[string]Decoder)(ptr)
  343. copy := map[string]Decoder{}
  344. for k, v := range cache {
  345. copy[k] = v
  346. }
  347. copy[cacheKey] = decoder
  348. retry = !atomic.CompareAndSwapPointer(&DECODERS, ptr, unsafe.Pointer(&copy))
  349. }
  350. }
  351. func getDecoderFromCache(cacheKey string) Decoder {
  352. ptr := atomic.LoadPointer(&DECODERS)
  353. cache := *(*map[string]Decoder)(ptr)
  354. return cache[cacheKey]
  355. }
  356. var typeDecoders map[string]Decoder
  357. var fieldDecoders map[string]Decoder
  358. func init() {
  359. typeDecoders = map[string]Decoder{}
  360. fieldDecoders = map[string]Decoder{}
  361. atomic.StorePointer(&DECODERS, unsafe.Pointer(&map[string]Decoder{}))
  362. }
  363. type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)
  364. type funcDecoder struct {
  365. func_ DecoderFunc
  366. }
  367. func (decoder *funcDecoder) decode(ptr unsafe.Pointer, iter *Iterator) {
  368. decoder.func_(ptr, iter)
  369. }
  370. func RegisterTypeDecoder(type_ string, func_ DecoderFunc) {
  371. typeDecoders[type_] = &funcDecoder{func_}
  372. }
  373. func RegisterFieldDecoder(type_ string, field string, func_ DecoderFunc) {
  374. fieldDecoders[fmt.Sprintf("%s/%s", type_, field)] = &funcDecoder{func_}
  375. }
  376. func ClearDecoders() {
  377. typeDecoders = map[string]Decoder{}
  378. fieldDecoders = map[string]Decoder{}
  379. }
  380. // emptyInterface is the header for an interface{} value.
  381. type emptyInterface struct {
  382. typ *struct{}
  383. word unsafe.Pointer
  384. }
  385. func (iter *Iterator) Read(obj interface{}) {
  386. type_ := reflect.TypeOf(obj)
  387. cacheKey := type_.String()
  388. cachedDecoder := getDecoderFromCache(cacheKey)
  389. if cachedDecoder == nil {
  390. decoder, err := decoderOfType(type_)
  391. if err != nil {
  392. iter.Error = err
  393. return
  394. }
  395. cachedDecoder = decoder
  396. addDecoderToCache(cacheKey, decoder)
  397. }
  398. e := (*emptyInterface)(unsafe.Pointer(&obj))
  399. cachedDecoder.decode(e.word, iter)
  400. }
  401. type prefix string
  402. func (p prefix) addTo(decoder Decoder, err error) (Decoder, error) {
  403. if err != nil {
  404. return nil, fmt.Errorf("%s: %s", p, err.Error())
  405. }
  406. return decoder, err
  407. }
  408. func decoderOfType(type_ reflect.Type) (Decoder, error) {
  409. switch type_.Kind() {
  410. case reflect.Ptr:
  411. return prefix("ptr").addTo(decoderOfPtr(type_.Elem()))
  412. default:
  413. return nil, errors.New("expect ptr")
  414. }
  415. }
  416. func decoderOfPtr(type_ reflect.Type) (Decoder, error) {
  417. typeDecoder := typeDecoders[type_.String()]
  418. if typeDecoder != nil {
  419. return typeDecoder, nil
  420. }
  421. switch type_.Kind() {
  422. case reflect.String:
  423. return &stringDecoder{}, nil
  424. case reflect.Int:
  425. return &intDecoder{}, nil
  426. case reflect.Int8:
  427. return &int8Decoder{}, nil
  428. case reflect.Int16:
  429. return &int16Decoder{}, nil
  430. case reflect.Int32:
  431. return &int32Decoder{}, nil
  432. case reflect.Int64:
  433. return &int64Decoder{}, nil
  434. case reflect.Uint:
  435. return &uintDecoder{}, nil
  436. case reflect.Uint8:
  437. return &uint8Decoder{}, nil
  438. case reflect.Uint16:
  439. return &uint16Decoder{}, nil
  440. case reflect.Uint32:
  441. return &uint32Decoder{}, nil
  442. case reflect.Uint64:
  443. return &uint64Decoder{}, nil
  444. case reflect.Float32:
  445. return &float32Decoder{}, nil
  446. case reflect.Float64:
  447. return &float64Decoder{}, nil
  448. case reflect.Bool:
  449. return &boolDecoder{}, nil
  450. case reflect.Struct:
  451. return decoderOfStruct(type_)
  452. case reflect.Slice:
  453. return prefix("[slice]").addTo(decoderOfSlice(type_))
  454. case reflect.Ptr:
  455. return prefix("[optional]").addTo(decoderOfOptional(type_.Elem()))
  456. default:
  457. return nil, fmt.Errorf("unsupported type: %v", type_)
  458. }
  459. }
  460. func decoderOfOptional(type_ reflect.Type) (Decoder, error) {
  461. decoder, err := decoderOfPtr(type_)
  462. if err != nil {
  463. return nil, err
  464. }
  465. return &optionalDecoder{type_, decoder}, nil
  466. }
  467. func decoderOfStruct(type_ reflect.Type) (Decoder, error) {
  468. fields := map[string]Decoder{}
  469. for i := 0; i < type_.NumField(); i++ {
  470. field := type_.Field(i)
  471. fieldDecoderKey := fmt.Sprintf("%s/%s", type_.String(), field.Name)
  472. decoder := fieldDecoders[fieldDecoderKey]
  473. tagParts := strings.Split(field.Tag.Get("json"), ",")
  474. jsonFieldName := tagParts[0]
  475. if jsonFieldName == "" {
  476. jsonFieldName = field.Name
  477. }
  478. if decoder == nil {
  479. var err error
  480. decoder, err = decoderOfPtr(field.Type)
  481. if err != nil {
  482. return prefix(fmt.Sprintf("{%s}", field.Name)).addTo(decoder, err)
  483. }
  484. }
  485. if len(tagParts) > 1 && tagParts[1] == "string" {
  486. decoder = &stringNumberDecoder{decoder}
  487. }
  488. if jsonFieldName != "-" {
  489. fields[jsonFieldName] = &structFieldDecoder{&field, decoder}
  490. }
  491. }
  492. switch len(fields) {
  493. case 0:
  494. return &skipDecoder{type_}, nil
  495. case 1:
  496. for fieldName, fieldDecoder := range fields {
  497. return &oneFieldStructDecoder{type_, fieldName, fieldDecoder}, nil
  498. }
  499. case 2:
  500. var fieldName1 string
  501. var fieldName2 string
  502. var fieldDecoder1 Decoder
  503. var fieldDecoder2 Decoder
  504. for fieldName, fieldDecoder := range fields {
  505. if fieldName1 == "" {
  506. fieldName1 = fieldName
  507. fieldDecoder1 = fieldDecoder
  508. } else {
  509. fieldName2 = fieldName
  510. fieldDecoder2 = fieldDecoder
  511. }
  512. }
  513. return &twoFieldsStructDecoder{type_, fieldName1, fieldDecoder1, fieldName2, fieldDecoder2}, nil
  514. case 3:
  515. var fieldName1 string
  516. var fieldName2 string
  517. var fieldName3 string
  518. var fieldDecoder1 Decoder
  519. var fieldDecoder2 Decoder
  520. var fieldDecoder3 Decoder
  521. for fieldName, fieldDecoder := range fields {
  522. if fieldName1 == "" {
  523. fieldName1 = fieldName
  524. fieldDecoder1 = fieldDecoder
  525. } else if fieldName2 == "" {
  526. fieldName2 = fieldName
  527. fieldDecoder2 = fieldDecoder
  528. } else {
  529. fieldName3 = fieldName
  530. fieldDecoder3 = fieldDecoder
  531. }
  532. }
  533. return &threeFieldsStructDecoder{type_,
  534. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil
  535. case 4:
  536. var fieldName1 string
  537. var fieldName2 string
  538. var fieldName3 string
  539. var fieldName4 string
  540. var fieldDecoder1 Decoder
  541. var fieldDecoder2 Decoder
  542. var fieldDecoder3 Decoder
  543. var fieldDecoder4 Decoder
  544. for fieldName, fieldDecoder := range fields {
  545. if fieldName1 == "" {
  546. fieldName1 = fieldName
  547. fieldDecoder1 = fieldDecoder
  548. } else if fieldName2 == "" {
  549. fieldName2 = fieldName
  550. fieldDecoder2 = fieldDecoder
  551. } else if fieldName3 == "" {
  552. fieldName3 = fieldName
  553. fieldDecoder3 = fieldDecoder
  554. } else {
  555. fieldName4 = fieldName
  556. fieldDecoder4 = fieldDecoder
  557. }
  558. }
  559. return &fourFieldsStructDecoder{type_,
  560. fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3,
  561. fieldName4, fieldDecoder4}, nil
  562. }
  563. return &structDecoder{type_, fields}, nil
  564. }
  565. func decoderOfSlice(type_ reflect.Type) (Decoder, error) {
  566. decoder, err := decoderOfPtr(type_.Elem())
  567. if err != nil {
  568. return nil, err
  569. }
  570. return &sliceDecoder{type_, type_.Elem(), decoder}, nil
  571. }