BookとUserの構造体
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 99/107。
チャレンジ
簡単Library Management System の中核となるデータモデルを構築しましょう!書籍と library member を表す基盤となる struct を作成し、適切なデフォルト値で初期化する constructor function も実装します。
コードは3つのファイルに整理します。
book.go:ID、Title、Author、ISBN、Available(boolean)の fields を持つBookstruct を Define します。ID、title、author、ISBN を parameters として受け取り、新しい Book への pointer を返すNewBookconstructor function を Create します。新しい book は常に available の状態で開始する必要があります。book の details を次の Format で返すInfo()method を追加します:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]user.go:ID、Name、Email、BorrowedBooks(book IDs を格納する string の slice)の fields を持つUserstruct を Define します。ID、name、email を受け取り、borrowed books list が empty の新しい User への pointer を返すNewUserconstructor を Create します。次を返すInfo()method を追加します:Member: [Name] ([Email]) - Books borrowed: [count]main.go: input から books と users を作成し、それらの information を表示して、モデルをまとめます。books の number を読み取り、続いて each book について、ID、title、author、ISBN をそれぞれ別の行から読み取ります。次に users の number を読み取り、each user について、ID、name、email をそれぞれ別の行から読み取ります。
each book の info をそれぞれ1行に出力し、その後に each user の info をそれぞれ1行に出力します。
次の input が提供されます。
- books の number
- each book について: ID、title、author、ISBN(それぞれ別の行)
- users の number
- each user について: ID、name、email(それぞれ別の行)
たとえば、次の入力が与えられた場合:
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: 0constructor がデフォルト値をどのように処理しているかに注目してください。books は available の状態で開始し、users は borrowed books がゼロの状態で開始します。constructor functions を使用して適切な初期化を保証するこのパターンは、信頼性の高いシステムを構築するうえで基本となります。
自分で試してみよう
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復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ