ポインタを使うべき時
-
データの変更が必要な場合:
- 関数やメソッド内で引数のデータを変更したいとき
-
大きなデータ構造:
- 大きなデータを関数に渡すときに、コピーを避けてメモリを節約したいとき
-
共有する必要がある場合:
- 複数の関数やメソッドで同じデータを扱いたいとき
-
nil チェックの必要がある場合:
- 値が存在しないことを示すために
nil
を使いたいとき
- 値が存在しないことを示すために
例:データを変更する関数
main.go
package main
import "fmt"
type User struct {
Name string
}
func UpdateName(user *User, newName string) {
user.Name = newName
}
func main() {
user := User{Name: "Alice"}
fmt.Println("Before:", user.Name)
UpdateName(&user, "Bob")
fmt.Println("After:", user.Name)
}
-
ポイント:
UpdateName
関数でUser
のName
を変更しています。ポインタを使うことで、元のデータを直接変更できます。
ポインタを使うべきでない時
-
データの変更が不要な場合:
- 関数やメソッドがデータを変更しないことが明確なとき
-
安全性を重視する場合:
- データが誤って変更されるのを防ぎたいとき
-
小さなデータ構造:
- 基本的な型や小さな構造体はコピーしてもパフォーマンスに影響が少ないため、ポインタを使わなくても良い
例:データを変更しない関数
package main
import "fmt"
type User struct {
Name string
}
func PrintName(user User) {
fmt.Println("User Name:", user.Name)
}
func main() {
user := User{Name: "Alice"}
PrintName(user)
}
-
ポイント:
PrintName
関数ではデータを変更しないため、ポインタを使わずに値を渡しています。データのコピーが作られますが、変更の必要がないので問題ありません
ポインタを使うか使わないかの決定の基準
- 目的: データを変更する必要があるか
- サイズ: データが大きいか小さいか
- 安全性: データの不変性を保ちたいか
- パフォーマンス: メモリと速度を最適化する必要があるか