Menu
Coddy logo textTech

セットへの追加

CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 33/68。

セットを作成したので、次のステップはそこに要素を追加する方法を学ぶことです。Goのセットは実際には内部でマップであるため、セットに要素を追加することは、マップにキーを追加することと同じです。

セットに要素を追加するには、新しいキーに空の構造体の値を割り当てるだけです:

colors["yellow"] = struct{}{}

struct{}{} 構文は、空の構造体リテラルを作成します。最初の struct{} は型を指定し、2番目の {} はそれを初期化します。これは Go でセット(集合)に要素を追加する標準的な方法です。

このアプローチの利点は、同じ要素を再度追加しようとしても、既存のエントリを単に上書きするだけで、セットの一意性が維持されることです。

この代入において、struct{}{} が唯一有効な構文であることに注意してください。型名なしで単に {} と記述すると、コンパイルエラー(missing type in composite literal)が発生します。マップリテラルの外側でマップのキーに値を代入する際は、常に型を明示的に指定する必要があります。

セットへの要素の追加は高速で簡単です。Goの効率的なmap実装を活用しながら、ユニークなアイテムを追跡するための真のセットの動作を提供します。

quiz icon腕試し

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

quiz icon腕試し

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

quiz icon腕試し

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

challenge icon

チャレンジ

簡単

Goのセット(集合)のイディオムを使用して、開発者の技術的能力を管理するスキル追跡システムを構築します。このチャレンジでは、重複を防ぎながら学習の進捗を追跡し、新しいスキルをセットに追加する方法を学びます。

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

  • 期待されるスキル数を表す文字列(例:"5") - これは参照用です
  • カンマで区切られたスキルを含む文字列(例:"Go,Docker,Kubernetes,Go,React,Docker,Python"

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

  1. Goのイディオムである map[string]struct{} を使用して、一意の技術スキルを保存するセットを作成します
  2. 3つの初期スキル "Programming""Problem Solving""Communication" でセットを初期化します
  3. 入力文字列をカンマで分割して、個々のスキル名を取得します
  4. カンマ区切りの文字列からすべてのスキルを処理します(カウントパラメータを使用せず、スライス全体を反復処理します)
  5. 入力からの各スキルについて、値として struct{}{} を使用してセットに追加します
  6. 各スキルが処理されるたびに、処理結果を表示します:
    • スキルがセットに新しく追加される場合:"Learning new skill: [skill]"
    • スキルが既にセットに存在する場合:"Already mastered: [skill]"
  7. すべてのスキルを処理した後、進捗の概要を表示します:
    • "Skills processed: [total_processed]" - スライスの長さを使用します
    • "New skills learned: [new_skills_count]"
    • "Total skills mastered: [total_unique_skills]"
  8. 最後に、開発者のスキルセットにあるすべてのスキルをリストします:
    • ヘッダー:"Complete skill set:"
    • 各スキルを個別の行に表示:"✓ [skill]"

重要: カウントパラメータではなく、range を使用してスライス内のすべてのスキルを反復処理してください。カウントは参照用に提供されていますが、ループの制御には使用しないでください。入力文字列の分割には strings パッケージを使用してください。追加する前にスキルが既に存在するかどうかを確認するには、comma okイディオム _, exists := skillSet[skill] を使用します。このチャレンジは、Goのセットに要素を追加することで、メンバーシップテストのための高速なルックアップパフォーマンスを提供しながら、一意性を自動的に処理する方法を示しています。

チートシート

Goのセット(map[string]struct{}として実装)に要素を追加するには、新しいキーに空の構造体を割り当てます:

colors["yellow"] = struct{}{}

struct{}{} 構文は、空の構造体リテラルを作成します。最初の struct{} は型を指定し、2番目の {} はそれを初期化します。これは、Goでセットに要素を追加する標準的な方法です。

自分で試してみよう

package main

import (
	"fmt"
	"sort"
	"strconv"
	"strings"
)

func main() {
	// 入力を読み込む
	var countStr string
	var skillsStr string
	fmt.Scanln(&countStr)
	fmt.Scanln(&skillsStr)
	
	// カウント文字列を整数に変換(参照用のみ - ループ内では使用しない)
	_, _ = strconv.Atoi(countStr)
	
	// 初期スキルセットでスキルセットを初期化
	skillSet := map[string]struct{}{
		"Programming":     struct{}{},
		"Problem Solving": struct{}{},
		"Communication":   struct{}{},
	}
	
	// スキル文字列を個々のスキルに分割
	skills := strings.Split(skillsStr, ",")
	
	// TODO: 以下にコードを記述してください
	// rangeを使用してスライス内のすべてのスキルを反復処理し、各スキルを処理する
	// comma okイディオムを使用する: _, exists := skillSet[skill]
	// 新しいスキルを追加する: skillSet[skill] = struct{}{}
	// 各スキルの処理結果を表示する
	// len(skills)を使用して進捗の概要を計算し表示する
	// 完全なスキルセット内のすべてのスキルをリストする(一貫した出力のためにソートを検討する)
	
}
quiz icon腕試し

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

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