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) }
この例では、次のことが行われています:
Person
という構造体が定義され、Name
(文字列)とAge
(整数)の2つのフィールドを持っています。NewPerson
というコンストラクタ関数が定義され、名前と年齢を受け取って、Person
構造体のインスタンスを生成し、それを返します。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.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を出力
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
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
という構造体を定義しています。構造体は複数のフィールドを持つデータ型で、ここではName
とAge
というフィールドを持っています。それぞれ、名前を格納するstring
型と年齢を格納するint
型です。
NewPersonコンストラクタ関数の定義
func NewPerson(name string, age int) Person { return Person{Name: name, Age: age} }
ここで、NewPerson
というコンストラクタ関数を定義しています。コンストラクタ関数とは、新しい構造体のインスタンスを初期化して返すための関数です。
この関数では、name
とage
を引数として受け取り、それらを使って新しい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を活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。