2021-11-23 GoのArrayは値型のデータ型で、Sliceは参照型のデータ型 / 値渡し(Call by Value)・参照渡し(Call by Reference)
GoのArrayは値型のデータ型で、Sliceは参照型のデータ型
Slice では、呼び出した先の関数が行った a[2] のデータへの変更が、呼び出し元のSliceに反映されています。
これらの挙動は、「Arrayは値型のデータ型で、Sliceは参照型のデータ型だから」と解説される場合があります。
Slice を関数に渡す場合、参照を渡しているのではなく、このデータ構造を コピーして渡している のです。 データを格納してあるArray領域へのポインタは渡しているので、その要素を変更すると呼び出し元に反映される場合もありますが、Len や Cap はコピーを渡しているに過ぎないので、append()などでそれらの値を関数の呼び出し先で変更しても、呼び出し元には反映されません。
See also. Go のスライスでハマッたところ - Block Rockin’ Codes
値渡し(Call by Value)・参照渡し(Call by Reference)
英語で値渡し、参照渡しってどう言うんだっけ?と思って調べた。
- 値渡し(Call by Value)
- 参照渡し(Call by Reference)
らしい。
引数(Parameter)の渡し方には2種類あり、その値そのものを渡す「値渡し(Call by Value)」とその変数への参照(アドレス)を渡す「参照渡し(Call by Reference)」があります。