回答編集履歴

1

追記

2018/07/03 02:49

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -21,3 +21,95 @@
21
21
  条件別に構造を変化させるなんてことはわざわざ行いません。
22
22
 
23
23
  存在しないように見えるフィールドは単に省略されているだけの場合が多いのです。
24
+
25
+
26
+
27
+ 追記:
28
+
29
+
30
+
31
+ サイズをReaderから取得したうえでデコーダーに渡したい場合の実装例です。
32
+
33
+ io.TeeReaderとio.Copyを組み合わせます。
34
+
35
+
36
+
37
+ https://play.golang.org/p/rHDT0SHUnwp
38
+
39
+ ```go
40
+
41
+ package main
42
+
43
+
44
+
45
+ import (
46
+
47
+ "bytes"
48
+
49
+ "encoding/json"
50
+
51
+ "fmt"
52
+
53
+ "io"
54
+
55
+ "io/ioutil"
56
+
57
+ "log"
58
+
59
+ )
60
+
61
+
62
+
63
+ var buff = bytes.NewBufferString(`{"messages":[],"body":[]}`)
64
+
65
+
66
+
67
+ func GetSizeFromReader(r io.Reader) (sz int64, reader io.Reader, err error) {
68
+
69
+ b := bytes.NewBuffer(nil)
70
+
71
+ n, err := io.Copy(ioutil.Discard, io.TeeReader(r, b))
72
+
73
+ if err != nil {
74
+
75
+ return 0, nil, err
76
+
77
+ }
78
+
79
+ return n, b, nil
80
+
81
+ }
82
+
83
+
84
+
85
+ func main() {
86
+
87
+ sz, r, err := GetSizeFromReader(buff)
88
+
89
+ if err != nil {
90
+
91
+ log.Fatalln(err)
92
+
93
+ }
94
+
95
+ if sz > 0 {
96
+
97
+ var v interface{}
98
+
99
+ if err := json.NewDecoder(r).Decode(&v); err != nil {
100
+
101
+ log.Fatalln(err)
102
+
103
+ }
104
+
105
+ fmt.Println(v)
106
+
107
+ }
108
+
109
+ }
110
+
111
+ ```
112
+
113
+
114
+
115
+ httpのハンドリングであればContent-Lengthヘッダーをパースするのも一つの手かと。