Contents
Struct fields should be unexported (lowercase) and initialized only via a constructor function. (構造体のフィールドは非公開(小文字)にし、コンストラクタ関数経由でのみ初期化する)
解説
構造体のフィールドを非公開にすることで、不正な状態での初期化を防ぎ、データの整合性を保証できます。コンストラクタ関数を使用することで、必須フィールドの初期化漏れや不正な値の設定を防止し、常に有効な状態のオブジェクトを作成できます。これは、カプセル化の原則に基づく重要な設計パターンであり、バグの混入を防ぎます。
具体例
// 悪い例(フィールドが公開されている)
type User struct {
Name string
Email string
Age int
}
func main() {
user := User{Name: "John"} // Emailが空で不正な状態
// ...
}
// 良い例(フィールドが非公開、コンストラクタ使用)
type User struct {
name string
email string
age int
}
func NewUser(name, email string, age int) (*User, error) {
if name == "" {
return nil, errors.New("name is required")
}
if !strings.Contains(email, "@") {
return nil, errors.New("invalid email")
}
if age < 0 {
return nil, errors.New("age must be positive")
}
return &User{
name: name,
email: email,
age: age,
}, nil
}
func (u *User) Name() string {
return u.name
}
func (u *User) Email() string {
return u.email
}
