コンストラクタ関数
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 10/107。
Goには他の言語のようなコンストラクタはありません。その代わりに、初期化された構造体を(多くの場合ポインタとして)返す NewTypeName という名前の関数を作成するのが慣習です。
基本的なコンストラクタ関数
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}デフォルト値を持つコンストラクタ
type Config struct {
Host string
Port int
Timeout int
}
func NewConfig(host string) *Config {
return &Config{
Host: host,
Port: 8080, // デフォルト値
Timeout: 30, // デフォルト値
}
}バリデーション付きのコンストラクタ
func NewPerson(name string, age int) *Person {
if name == "" {
name = "Unknown"
}
if age < 0 {
age = 0
}
return &Person{
Name: name,
Age: age,
}
}コンストラクタ関数の使用
func main() {
p1 := NewPerson("Alice", 25)
fmt.Println(p1.Name) // Alice
p2 := NewPerson("", -5)
fmt.Println(p2.Name) // Unknown
fmt.Println(p2.Age) // 0
}コンストラクタ関数は、& を使用してポインタ (*StructName) を返します。これにより、構造体のコピーを回避し、ポインタレシーバを持つメソッドが直接動作できるようになります。バリデーションやデフォルト値はコンストラクタ内に記述します。
チャレンジ
中級バリデーション機能を備えた BankAccount 構造体のコンストラクタ関数 NewBankAccount を作成してください:
name(string) とbalance(float64) を引数として受け取りますnameが空の場合は、デフォルトで"Unnamed"に設定しますbalanceが負の場合は、デフォルトで0に設定しますOwnerは常に"Default Owner"に設定します- 新しい構造体へのポインタを返します
チートシート
Goはコンストラクタの代わりにコンストラクタ関数を使用します。慣習として、それらをNewTypeNameと命名し、初期化された構造体へのポインタを返します。
基本的なコンストラクタ関数:
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}デフォルト値を持つコンストラクタ:
func NewConfig(host string) *Config {
return &Config{
Host: host,
Port: 8080, // デフォルト値
Timeout: 30, // デフォルト値
}
}バリデーション(検証)付きのコンストラクタ:
func NewPerson(name string, age int) *Person {
if name == "" {
name = "Unknown"
}
if age < 0 {
age = 0
}
return &Person{
Name: name,
Age: age,
}
}コンストラクタ関数は、構造体のコピーを避け、ポインタレシーバメソッドが直接動作するように、&を使用してポインタ(*StructName)を返します。
自分で試してみよう
package main
import "fmt"
func main() {
var name string
var balance float64
fmt.Scan(&name, &balance)
account := NewBankAccount(name, balance)
fmt.Printf("Account: %s\n", account.Name)
fmt.Printf("Balance: %.2f\n", account.Balance)
fmt.Printf("Owner: %s\n", account.Owner)
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー