Go練習問題3-07:コンストラクタ関数を理解しよう

記事内に商品プロモーションを含む場合があります

Go言語の初心者向け問題3-7:コンストラクタ関数を理解しよう

この問題を解くために必要な知識:
レベル1~2の知識関数の定義と呼び出し関数の戻り値と複数の戻り値関数の可変長引数無名関数(匿名関数)クロージャ構造体の定義とコンストラクタ関数構造体の埋め込みメソッドの定義とレシーバインターフェース型アサーション型スイッチ

<<前の問題 問題集Top 次の問題>>

Go言語の文法「コンストラクタ関数」とは





ここではコンストラクタ関数の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。

構造体(struct)は複数のフィールドをまとめた複合データ型です。構造体を使うことで、関連するデータを一つにまとめて扱うことができます。また、コンストラクタ関数とは、構造体を初期化してインスタンスを返すための関数です。

例:Person構造体とコンストラクタ関数の作成

package main

import "fmt"

// Person構造体の定義
type Person struct {
    Name string
    Age  int
}

// Person構造体のコンストラクタ関数
func NewPerson(name string, age int) Person {
    return Person{Name: name, Age: age}
}

func main() {
    // コンストラクタ関数を使って新しいPersonを作成
    p := NewPerson("Alice", 30)

    // Personの情報を出力
    fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}

この例では、次のことが行われています:

  1. Personという構造体が定義され、Name(文字列)とAge(整数)の2つのフィールドを持っています。
  2. NewPersonというコンストラクタ関数が定義され、名前と年齢を受け取って、Person構造体のインスタンスを生成し、それを返します。
  3. main関数では、このコンストラクタ関数を使って新しいPersonインスタンスを作成し、その情報を出力しています。

Go言語では、このようにコンストラクタ関数を使って構造体を簡潔に初期化し、利用することができます。

Go練習問題3-7:構造体とコンストラクタ関数を使ってみよう

構造体とコンストラクタ関数を使って新しいオブジェクトを作成するプログラムを作成してください。

このプログラムでは、Personという構造体を定義し、NewPersonというコンストラクタ関数を使ってPersonオブジェクトを初期化します。

作成したPersonオブジェクトの情報(名前と年齢)を画面に出力してください。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • 構造体Personを定義し、Name(名前)とAge(年齢)の2つのフィールドを持つこと。
  • NewPersonというコンストラクタ関数を作成し、Person構造体のインスタンスを返すこと。
  • NewPerson関数を使って、Nameとして「山田太郎」、Ageとして30を持つPersonを作成すること。
  • 作成したPersonの名前と年齢をfmt.Printfを使って画面に出力すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

名前: 山田太郎
年齢: 30歳

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.import文
 1-1. fmtパッケージのインポート

2.Person構造体の定義
 2-1. Nameフィールドの定義(string型)
 2-2. Ageフィールドの定義(int型)

3.NewPerson関数の定義
 3-1. 引数としてname(string型)とage(int型)を受け取る
 3-2. Person構造体のインスタンスを初期化して返す

4.main関数
 4-1. NewPerson関数を使用して、Personのインスタンスを作成
 4-2. fmt.Printfを使って、PersonのNameを出力
 4-3. fmt.Printfを使って、PersonのAgeを出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

package main

import "fmt"

// Person構造体の定義
type Person struct {
    Name string
    Age  int
}

// 【穴埋め問題1】
// ここにNewPerson関数を定義し、nameとageを受け取り、Person構造体を返すコードを書いてください。

func main() {
    // 【穴埋め問題2】
    // ここにNewPerson関数を使ってPersonインスタンスを作成し、そのインスタンスをperson変数に代入するコードを書いてください。

    // 作成したPersonの情報を出力
    fmt.Printf("名前: %s\n", person.Name)
    fmt.Printf("年齢: %d歳\n", person.Age)
}

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

package main

import "fmt"

// 構造体Personの定義
type Person struct {
    Name string
    Age  int
}

// コンストラクタ関数NewPersonを定義
// この関数は新しいPersonを初期化して返す
func NewPerson(name string, age int) Person {
    return Person{Name: name, Age: age}
}

// main関数はプログラムのエントリーポイント
func main() {
    // コンストラクタ関数を使って新しいPersonを作成
    person := NewPerson("山田太郎", 30)
    
    // 作成したPersonの情報を出力
    fmt.Printf("名前: %s\n", person.Name)
    fmt.Printf("年齢: %d歳\n", person.Age)
}

正解コードの解説

このコードでは、Go言語の構造体とコンストラクタ関数を使って、オブジェクトを初期化し、それを利用する方法を学びます。特に、コンストラクタ関数の使い方に注目して解説します。

import文

import "fmt"

ここでは、fmtパッケージをインポートしています。fmtは、文字列の出力を行うために使用されます。

Person構造体の定義

type Person struct {
    Name string
    Age  int
}

Personという構造体を定義しています。構造体は複数のフィールドを持つデータ型で、ここではNameAgeというフィールドを持っています。それぞれ、名前を格納するstring型と年齢を格納するint型です。

NewPersonコンストラクタ関数の定義

func NewPerson(name string, age int) Person {
    return Person{Name: name, Age: age}
}

ここで、NewPersonというコンストラクタ関数を定義しています。コンストラクタ関数とは、新しい構造体のインスタンスを初期化して返すための関数です。

この関数では、nameageを引数として受け取り、それらを使って新しいPerson構造体を作成し、返します。このように、コンストラクタ関数を使うことで、構造体を簡単に初期化できます。

main関数

func main() {
    person := NewPerson("山田太郎", 30)
    fmt.Printf("名前: %s\n", person.Name)
    fmt.Printf("年齢: %d歳\n", person.Age)
}

main関数は、Goプログラムのエントリーポイントです。ここでは、NewPersonコンストラクタ関数を使って、新しいPersonインスタンスを作成し、personという変数に代入しています。

その後、fmt.Printfを使って、このpersonの名前と年齢を画面に出力しています。

まとめ

このコードを通じて、Go言語における構造体の定義方法と、コンストラクタ関数を使って構造体を初期化する方法を学びました。

特に、コンストラクタ関数を使うことで、構造体の初期化を簡単に行える点が重要です。これにより、コードの再利用性が高まり、より保守しやすいプログラムが作成できます。 ​

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Go練習問題集へ戻る
    トップページへ戻る