BookとUserの構造体
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 99/107。
チャレンジ
簡単図書館管理システムのコアとなるデータモデルを構築しましょう!本と図書館の利用者を表現する基礎的な構造体を作成し、それらを適切なデフォルト値で初期化するコンストラクタ関数を実装します。
コードは以下の3つのファイルに分けて構成します:
book.go:ID、Title、Author、ISBN、およびAvailable(boolean) のフィールドを持つBook構造体を定義します。ID、タイトル、著者、ISBNをパラメータとして受け取り、新しい Book へのポインタを返すNewBookコンストラクタ関数を作成してください。新しい本は常に利用可能(available)な状態で開始する必要があります。また、本の詳細を[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]という形式で返すInfo()メソッドを追加してください。user.go:ID、Name、Email、およびBorrowedBooks(本のIDを格納する文字列のスライス) のフィールドを持つUser構造体を定義します。ID、名前、メールアドレスを受け取り、空の借用本リストを持つ新しい User へのポインタを返すNewUserコンストラクタを作成してください。また、Member: [Name] ([Email]) - Books borrowed: [count]という形式を返すInfo()メソッドを追加してください。main.go: 入力から本と利用者を作成し、それらの情報を表示することで、モデルを統合します。最初に本の数を読み取り、次に各本について ID、タイトル、著者、ISBN を別々の行から読み取ります。次に利用者の数を読み取り、各利用者について ID、名前、メールアドレスを別々の行から読み取ります。
各本の情報をそれぞれの行に出力し、続いて各利用者の情報をそれぞれの行に出力してください。
以下の入力が提供されます:
- 本の数
- 各本について:ID、タイトル、著者、ISBN(それぞれ別々の行)
- 利用者の数
- 各利用者について:ID、名前、メールアドレス(それぞれ別々の行)
例えば、以下のように入力された場合:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com出力は以下のようになります:
[B001] "The Go Programming Language" by Alan Donovan (ISBN: 978-0134190440) - Available: true
[B002] "Clean Code" by Robert Martin (ISBN: 978-0132350884) - Available: true
Member: Alice Smith (alice@library.com) - Books borrowed: 0また、以下のように入力された場合:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com出力は以下のようになります:
[B100] "Design Patterns" by Gang of Four (ISBN: 978-0201633610) - Available: true
Member: Bob Jones (bob@email.com) - Books borrowed: 0
Member: Carol White (carol@email.com) - Books borrowed: 0コンストラクタがどのようにデフォルト値を処理しているかに注目してください。本は利用可能な状態で始まり、利用者は借りている本がゼロの状態で始まります。適切な初期化を保証するためにコンストラクタ関数を使用するこのパターンは、信頼性の高いシステムを構築するための基本です!
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 本の数を読み込む
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: 本を格納するためのスライスを作成する
// 各本の詳細を読み込む
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
// TODO: NewBook コンストラクタを使用して新しい本を作成し、スライスに追加する
}
// ユーザーの数を読み込む
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: ユーザーを格納するためのスライスを作成する
// 各ユーザーの詳細を読み込む
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: NewUser コンストラクタを使用して新しいユーザーを作成し、スライスに追加する
}
// TODO: Info() メソッドを使用して各本の情報を表示する
// TODO: Info() メソッドを使用して各ユーザーの情報を表示する
fmt.Println() // プレースホルダー - 実装時に削除してください
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー