Menu
CoddyTech

コンストラクタ関数

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)を返します。これにより、構造体のコピーを避け、ポインターレシーバーを持つメソッドが直接動作できるようになります。検証とデフォルト値の設定はコンストラクター内で行います。

challenge icon

チャレンジ

中級

検証を行う、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)
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ