Menu
Coddy logo textTech

BookとUserの構造体

CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 99/107。

challenge icon

チャレンジ

簡単

Library Management System の中核となるデータモデルを構築しましょう!書籍と library member を表す基盤となる struct を作成し、適切なデフォルト値で初期化する constructor function も実装します。

コードは3つのファイルに整理します。

  • book.go: IDTitleAuthorISBNAvailable(boolean)の fields を持つ Book struct を Define します。ID、title、author、ISBN を parameters として受け取り、新しい Book への pointer を返す NewBook constructor function を Create します。新しい book は常に available の状態で開始する必要があります。book の details を次の Format で返す Info() method を追加します: [ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]
  • user.go: IDNameEmailBorrowedBooks(book IDs を格納する string の slice)の fields を持つ User struct を Define します。ID、name、email を受け取り、borrowed books list が empty の新しい User への pointer を返す NewUser constructor を 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: 0

constructor がデフォルト値をどのように処理しているかに注目してください。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() // プレースホルダー - 実装時に削除する
}

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

自分で練習してみよう: Goオンラインコンパイラ