teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

typo

2017/12/27 09:21

投稿

mattn
mattn

スコア5030

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 を超えたタイミングで容量が収まらないので別のメモリを確保しています。これと同じ事が質問者さんのコードでもきます。ですので set 関数には obj のアドレスを渡し、set の中ではポインタのまま扱わなければならない事になります。
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

2017/12/27 09:21

投稿

mattn
mattn

スコア5030

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

2017/12/27 09:06

投稿

mattn
mattn

スコア5030

answer CHANGED
@@ -73,7 +73,7 @@
73
73
 
74
74
  cap を超えたタイミングで容量が収まらないので別のメモリを確保しています。これと同じ事が質問者さんのコードでも置きます。ですので set 関数には obj のアドレスを渡し、set の中ではポインタのまま扱わなければならない事になります。
75
75
 
76
- set の最初の ※1 では obj のアドレスを渡しています。※2 ではポインタをデリファレンスしています。v はデリファレンス結果であり、set の中での v は Set により呼び出し元の obj のアドレスを持っている事になります。次に reflect.Append は interface{} 型のまま呼び出せないので実体を参照する為にもう1回 Elem() を呼び出しています。※3 で reflect.Append の戻り値を使って 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

2017/12/27 09:04

投稿

mattn
mattn

スコア5030

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  > 様々な形式を取りうるJSONなので、Interfaceの利用は不可避かと思いますが、正しく理解できていないようです。お手数ですが、対処法をご教示いただけないでしょうか。
2
2
 
3
- 質問者さんコードの間違いを正して正しく理解されたい様に見えましたので、代替案ではなく添削とさせて頂きます。
3
+ 質問者さんは、コードの間違いを正して正しく理解されたい様に見えましたので、代替案ではなく添削とさせて頂きます。
4
4
 
5
5
  正解はこのコードになります。
6
6
 

1

fix

2017/12/27 09:02

投稿

mattn
mattn

スコア5030

answer CHANGED
@@ -1,4 +1,4 @@
1
- >様々な形式を取りうるJSONなので、Interfaceの利用は不可避かと思いますが、正しく理解できていないようです。お手数ですが、対処法をご教示いただけないでしょうか。
1
+ > 様々な形式を取りうるJSONなので、Interfaceの利用は不可避かと思いますが、正しく理解できていないようです。お手数ですが、対処法をご教示いただけないでしょうか。
2
2
 
3
3
  質問者さんコードの間違いを正して正しく理解されたい様に見えましたので、代替案ではなく添削とさせて頂きます。
4
4