Go言語において、「値渡し」と「ポインタ渡し」は関数にデータを渡す二つの基本的な方法です。
- 値渡し (Value Passing)
値渡しでは、関数に値のコピーを渡します。この方法で関数に値を渡すと、関数内で値を変更しても、元の値には影響を与えません。つまり、元のデータは安全で、変更されることはありません。これにより、予期しない副作用を避けることができますが、大きなデータ構造をコピーするとパフォーマンスが低下する可能性があります。
func addOne(val int) int {
val += 1
return val
}
func main() {
original := 2
new := addOne(original)
fmt.Println(original) // 出力: 2
fmt.Println(new) // 出力: 3
}
- ポインタ渡し (Pointer Passing)
ポインタ渡しでは、値のアドレス(メモリ上の位置)を関数に渡します。関数内でポインタを使ってデータを変更すると、その変更は元のデータにも反映されます。これは、大きなデータ構造や、関数間で状態を共有する必要がある場合に有効ですが、不適切に使用するとバグやデータの不整合を引き起こす可能性があります。
func addOneByPointer(val *int) {
*val += 1
}
func main() {
original := 2
addOneByPointer(&original)
fmt.Println(original) // 出力: 3
}
どちらを使うべきか
- 小さなデータ型や、関数が元のデータを変更する必要がない場合には値渡しを使うと良いでしょう。
- 大きな構造体や、元のデータを更新する必要がある場合にはポインタ渡しを使うと効率的です。
最終的には、プログラムの要件とパフォーマンスのバランスを考慮して選択することが大切です。