回答編集履歴
5
typo
answer
CHANGED
@@ -72,7 +72,7 @@
|
|
72
72
|
```
|
73
73
|
[https://play.golang.org/p/Ob6JoVN4nwh](https://play.golang.org/p/Ob6JoVN4nwh)
|
74
74
|
|
75
|
-
cap を超えたタイミングで容量が収まらないので別のメモリを確保しています。これと同じ事が質問者さんのコードでも
|
75
|
+
cap を超えたタイミングで容量が収まらないので別のメモリを確保しています。これと同じ事が質問者さんのコードでも起きます。ですので set 関数には obj のアドレスを渡し、set の中ではポインタのまま扱わなければならない事になります。
|
76
76
|
|
77
77
|
set の最初の ※1 では obj のアドレスを渡しています。※2 ではポインタをデリファレンスしています。v はデリファレンス結果であり、set の中での v は呼び出し元の obj のアドレスを持っている事になります。次に reflect.Append は interface{} 型のまま呼び出せないので実体を参照する為にもう1回 Elem() を呼び出しています。※3 で reflect.Append の戻り値を使って v の値を更新しています。
|
78
78
|
|
4
fix
answer
CHANGED
@@ -45,6 +45,7 @@
|
|
45
45
|
fmt.Println("v=", v) // value2
|
46
46
|
}
|
47
47
|
```
|
48
|
+
[https://play.golang.org/p/EPZe8uMoEbQ](https://play.golang.org/p/EPZe8uMoEbQ)
|
48
49
|
|
49
50
|
まず Go の slice は伸長し長さがcapを超えるとアドレスが変わります。どういう事かというとこれを実行して貰えると分かります。
|
50
51
|
|
3
fix
answer
CHANGED
@@ -73,7 +73,7 @@
|
|
73
73
|
|
74
74
|
cap を超えたタイミングで容量が収まらないので別のメモリを確保しています。これと同じ事が質問者さんのコードでも置きます。ですので set 関数には obj のアドレスを渡し、set の中ではポインタのまま扱わなければならない事になります。
|
75
75
|
|
76
|
-
set の最初の ※1 では obj のアドレスを渡しています。※2 ではポインタをデリファレンスしています。v はデリファレンス結果であり、set の中での v は
|
76
|
+
set の最初の ※1 では obj のアドレスを渡しています。※2 ではポインタをデリファレンスしています。v はデリファレンス結果であり、set の中での v は呼び出し元の obj のアドレスを持っている事になります。次に reflect.Append は interface{} 型のまま呼び出せないので実体を参照する為にもう1回 Elem() を呼び出しています。※3 で reflect.Append の戻り値を使って v の値を更新しています。
|
77
77
|
|
78
78
|
```go
|
79
79
|
v.Set(reflect.Append(v.Elem(), sr))
|
2
fix
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
> 様々な形式を取りうるJSONなので、Interfaceの利用は不可避かと思いますが、正しく理解できていないようです。お手数ですが、対処法をご教示いただけないでしょうか。
|
2
2
|
|
3
|
-
質問者さんコードの間違いを正して正しく理解されたい様に見えましたので、代替案ではなく添削とさせて頂きます。
|
3
|
+
質問者さんは、コードの間違いを正して正しく理解されたい様に見えましたので、代替案ではなく添削とさせて頂きます。
|
4
4
|
|
5
5
|
正解はこのコードになります。
|
6
6
|
|
1
fix
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
>様々な形式を取りうるJSONなので、Interfaceの利用は不可避かと思いますが、正しく理解できていないようです。お手数ですが、対処法をご教示いただけないでしょうか。
|
1
|
+
> 様々な形式を取りうるJSONなので、Interfaceの利用は不可避かと思いますが、正しく理解できていないようです。お手数ですが、対処法をご教示いただけないでしょうか。
|
2
2
|
|
3
3
|
質問者さんコードの間違いを正して正しく理解されたい様に見えましたので、代替案ではなく添削とさせて頂きます。
|
4
4
|
|