構造体のMap
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 26/68。
マップは、構造体を値として保存すると非常に強力になります。このパターンにより、意味のあるキーを使用して複雑で構造化されたデータを整理し、簡単に検索や取得ができるようになります。
構造体をマップの値として使用すると、本質的には各キーが完全なデータレコードを指すコレクションを作成することになります。このようなマップを宣言して初期化する方法は次のとおりです。
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}他のマップ操作と同様に、マップを通じて構造体データにアクセスし、操作することができます。学生の情報を取得するには、単にその名前をキーとして使用します。
alice := students["Alice"]
fmt.Println(alice.ID) // 出力: 101
fmt.Println(alice.Grade) // 出力: Aこのパターンは、ユーザープロファイル、製品カタログ、設定など、構造化されたデータと高速なキーベースのアクセスの両方が必要な、関連するデータのコレクションを保存するためのGoアプリケーションにおいて非常に一般的です。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単構造体を値として持つマップを使用して、学生の成績管理システムを作成してください。このチャレンジでは、効率的な検索と取得のために、意味のあるキーを使用して複雑な学生データを整理する方法を学びます。
2つの入力を受け取ります:
- 学生の数を表す文字列(例:
"4") - 次の形式の学生データを含む文字列:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(例:"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
あなたのタスクは以下の通りです:
- 以下のフィールドを持つ
Student構造体を定義します:ID(int) - 学生のID番号Grade(string) - 学生の成績(文字)
- キーが学生の名前(文字列)で、値が
Student構造体であるマップを作成します - 2番目の入力から学生データを解析します:
- 入力をカンマで分割して、個々の学生のエントリを取得します
- 各エントリをコロンで分割して、名前、ID、成績に分けます
- ID文字列を整数に変換します
Student構造体を作成し、名前をキーとしてマップに追加します
- すべての学生を名前のアルファベット順に、次の形式で表示します:
"[name]: ID [id], Grade [grade]" - 成績統計を計算して表示します:
- 各成績(A, B, C, D, F)の学生数をカウントします
- 存在する各成績のカウントを次の形式で表示します:
"Grade [grade]: [count] students" - 成績をアルファベット順(A, B, C, D, F)に表示します
- 最も高いIDを持つ学生を次の形式で検索して表示します:
"Highest ID: [name] ([id])" - 学生の総数を表示します:
"Total students: [count]"
ID文字列を整数に変換するには strconv パッケージを、学生の名前をアルファベット順にソートするには sort パッケージを使用してください。このチャレンジは、構造体を値に持つマップが、意味のある識別子を使用して複雑なデータコレクションを整理し、アクセスするための効率的な方法であることを示しています。
チートシート
マップは構造体を値として格納することができ、各キーが完全なデータレコードを指すコレクションを作成できます。
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}キーを使用して、マップ経由で構造体データにアクセスします。
alice := students["Alice"]
fmt.Println(alice.ID) // 出力: 101
fmt.Println(alice.Grade) // 出力: Aこのパターンは、ユーザープロファイル、製品カタログ、設定情報など、構造化されたデータとキーに基づいた高速なアクセスの両方が必要な、関連データのコレクションを保存するためによく使用されます。
自分で試してみよう
package main
import (
"fmt"
)
func main() {
// 入力を読み込む
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: ここでStudent構造体を定義する
// TODO: 学生を保存するためのマップを作成する(名前をキー、Student構造体を値とする)
// TODO: 学生データを解析し、マップにデータを入力する
// TODO: すべての学生を名前のアルファベット順に表示する
// TODO: 成績統計を計算して表示する
// TODO: IDが最も高い学生を見つけて表示する
// TODO: 学生の総数を表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。