セットへの追加
CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 33/68。
これで集合が作成できたので、次のステップは要素を追加する方法を学ぶことです。Go の集合は実際には内部で map を使用しているため、集合に要素を add することは、map にキーを追加することと同じです。
set に要素を追加するには、新しいキーに空の構造体の値を単純に代入します。
colors["yellow"] = struct{}{}struct{}{}構文は空の構造体リテラルを作成します。最初のstruct{}は型を指定し、2番目の{}はそれを初期化します。これは、Goでセットに要素をaddする標準的な方法です。
このアプローチの優れた点は、同じ要素をもう一度addしようとしても、単にexistingエントリを上書きするだけで、セットの一意性が保たれることです。
struct{}{} がこの代入に対して有効な構文である only のものであることに注意してください。型名なしで単に {} と記述すると、コンパイルエラー missing type in composite literal が発生します。マップリテラルの外でマップキーに値を代入する場合、型は常に明示的に指定する必要があります。
集合への要素の追加は高速で簡単です。Go の効率的な map 実装を活用しながら、一意の items を追跡するための真の集合動作を実現できます。
チャレンジ
簡単Go の set idiom を使用して、開発者の技術的な能力を管理するスキル追跡システムを構築します。このチャレンジでは、重複を防ぎながら set に新しいスキルを追加し、Learning の progress を追跡する方法を示します。
次の 2 つの入力を受け取ります。
- 予想されるスキル数を表す文字列(例:
"5") - これは参照用のみです - カンマ区切りのスキルを含む文字列(例:
"Go,Docker,Kubernetes,Go,React,Docker,Python")
あなたのタスクは次のとおりです。
- Go の idiom である
map[string]struct{}を使用して、重複しない技術スキルを格納する set を作成する - set を 3 つの starter skills、
"Programming"、"Problem Solving"、"Communication"で Initialize する - 入力文字列をカンマで分割して Parse し、individual なスキル名を取得する
- カンマ区切り文字列の ALL skills を Process する(count パラメーターは使用せず、slice 全体を Iterate する)
- 入力の各スキルを、値として
struct{}{}を使用して set に Add する - 各スキルを Process する際に出力して、processing の結果を Display する
- スキルが set にとって新しい場合:
"Learning new skill: [skill]" - スキルがすでに set に exists する場合:
"Already mastered: [skill]"
- スキルが set にとって新しい場合:
- ALL skills の processing 後、progress の summary を Display する
"Skills processed: [total_processed]"- skills slice の長さを使用する"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- 最後に、開発者の skill set にある ALL skills を List する
- Header:
"Complete skill set:" - 各スキルを別々の行に表示する:
"✓ [skill]"
- Header:
重要: count パラメーターではなく、slice 内の ALL skills を Iterate するために range を使用してください。count は参照用に提供されますが、loop を制御するために使用してはいけません。入力文字列を分割するには strings package を使用してください。スキルを Add する前にすでに exists するか確認するには、comma ok idiom の _, exists := skillSet[skill] を使用してください。このチャレンジでは、Go set に要素を Add すると uniqueness が自動的に処理され、membership testing の高速な lookup performance が得られることを示します。
自分で試してみよう
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// 入力を読み取る
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// count文字列を整数に変換する(参考用のみ - ループでは使用しない)
_, _ = strconv.Atoi(countStr)
// スタータースキルでスキルセットを初期化する
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// skills文字列を個々のスキルに分割する
skills := strings.Split(skillsStr, ",")
// TODO: 以下にコードを書いてください
// rangeを使用してスライス内のすべてのスキルを反復処理し、各スキルを処理する
// カンマokイディオムを使用: _, exists := skillSet[skill]
// 新しいスキルを追加: skillSet[skill] = struct{}{}
// 各スキルの処理結果を表示する
// len(skills)を使用して進捗サマリーを計算して表示する
// List all skills in the complete skill set (consider sorting for consistent output)
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ