要素の存在確認
CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 34/68。
集合に要素を追加できるようになったところで、次に重要な操作は、特定の要素が集合に存在するかどうかを確認することです。ここで、Go の「comma ok」イディオムが非常に役立ちます。
セット内に要素が存在するか確認するには、マップ内のキーを確認するときと同じ構文を使用します。
_, ok := colors["red"]
if ok {
fmt.Println("Red is in the set")
} else {
fmt.Println("Red is not in the set")
}アンダースコア _ が使われているのは、実際の値(常に空の構造体)を気にしないためです。気にしているのはブール型の ok 変数だけで、これはキーが存在するかどうかを示します。
このパターンを if 文で直接使用して、より簡潔なコードにすることもできます。
if _, exists := colors["blue"]; exists {
fmt.Println("Blue is in the set")
}このメンバーシップテストは高速かつ効率的で、Go の最適化された map 実装を活用し、真の set データ構造によるパフォーマンス上の利点を得られます。
チャレンジ
簡単Go の set idiom を使用して、特定の person がプロジェクトの team に所属しているかを確認する team member verification system を構築してください。この challenge では、set への membership をテストするために comma ok idiom を使用する方法を示します。
2 つの input を受け取ります:
- comma で区切られた team members を含む string(例:
"Alice,Bob,Charlie,Diana,Eve") - 確認する people を comma で区切って含む string(例:
"Bob,Frank,Alice,Grace,Charlie")
あなたの task は次のとおりです:
- Go idiom
map[string]struct{}を使用して set を Create し、team members を格納する - 最初の input string を comma で Split し、個々の team member の名前を取得する
- 値として empty struct literal
{}を使用し、each team member を set に Add する - 2 番目の input string を comma で Split し、verification 対象の people の list を取得する
- 確認する each person について、comma ok idiom
_, ok := teamSet[person]を使用して membership をテストする - 確認中の each person の verification results を Display する:
- person が team に所属している場合:
"[person] is on the team" - person が team に所属していない場合:
"[person] is not on the team"
- person が team に所属している場合:
- すべての people を確認した後、summary を Display する:
"Team size: [team_member_count]""People checked: [people_checked_count]""Team members found: [found_count]""Non-team members: [not_found_count]"
strings package を使用して、input strings を comma で Split してください。この challenge では、comma ok idiom によって Go set の membership を安全かつ効率的に確認でき、value と key が exists かどうかを示す boolean の両方が返される仕組みを示します。
自分で試してみよう
package main
import (
"fmt"
"strings"
)
func main() {
// 入力を読み取る
var teamMembersInput string
var peopleToCheckInput string
fmt.Scanln(&teamMembersInput)
fmt.Scanln(&peopleToCheckInput)
// 入力文字列を解析する
teamMembers := strings.Split(teamMembersInput, ",")
peopleToCheck := strings.Split(peopleToCheckInput, ",")
// TODO: 以下にコードを書いてください
// map[string]struct{}を使ってセットを作成する
// チームメンバーをセットに追加する
// comma okイディオムを使って各人をチェックする
// 検証結果とサマリーを表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ