Menu
Coddy logo textTech

コンストラクタ関数

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" に設定します
  • 新しい構造体へのポインタを返します

チートシート

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)
}
quiz icon腕試し

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

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