Menu
Coddy logo textTech

構造体の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アプリケーションにおいて非常に一般的です。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

challenge icon

チャレンジ

簡単

構造体を値として持つマップを使用して、学生の成績管理システムを作成してください。このチャレンジでは、効率的な検索と取得のために、意味のあるキーを使用して複雑な学生データを整理する方法を学びます。

2つの入力を受け取ります:

  • 学生の数を表す文字列(例:"4"
  • 次の形式の学生データを含む文字列:"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(例:"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A"

あなたのタスクは以下の通りです:

  1. 以下のフィールドを持つ Student 構造体を定義します:
    • ID (int) - 学生のID番号
    • Grade (string) - 学生の成績(文字)
  2. キーが学生の名前(文字列)で、値が Student 構造体であるマップを作成します
  3. 2番目の入力から学生データを解析します:
    • 入力をカンマで分割して、個々の学生のエントリを取得します
    • 各エントリをコロンで分割して、名前、ID、成績に分けます
    • ID文字列を整数に変換します
    • Student 構造体を作成し、名前をキーとしてマップに追加します
  4. すべての学生を名前のアルファベット順に、次の形式で表示します:"[name]: ID [id], Grade [grade]"
  5. 成績統計を計算して表示します:
    • 各成績(A, B, C, D, F)の学生数をカウントします
    • 存在する各成績のカウントを次の形式で表示します:"Grade [grade]: [count] students"
    • 成績をアルファベット順(A, B, C, D, F)に表示します
  6. 最も高いIDを持つ学生を次の形式で検索して表示します:"Highest ID: [name] ([id])"
  7. 学生の総数を表示します:"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: 学生の総数を表示する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン