GoのArrayは値型のデータ型で、Sliceは参照型のデータ型

Slice では、呼び出した先の関数が行った a[2] のデータへの変更が、呼び出し元のSliceに反映されています。

これらの挙動は、「Arrayは値型のデータ型で、Sliceは参照型のデータ型だから」と解説される場合があります。

Slice を関数に渡す場合、参照を渡しているのではなく、このデータ構造を コピーして渡している のです。 データを格納してあるArray領域へのポインタは渡しているので、その要素を変更すると呼び出し元に反映される場合もありますが、Len や Cap はコピーを渡しているに過ぎないので、append()などでそれらの値を関数の呼び出し先で変更しても、呼び出し元には反映されません。

Go の Slice の落とし穴 - Qiita

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)」があります。

値渡し(Call by Value)と参照渡し(Call by Reference) | ソフトウェア開発日記