コンストラクタ関数
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"に設定します - 新しい構造体へのポインターを返します
自分で試してみよう
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復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ