要素の存在確認
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実装を活用することで、真のセットデータ構造のパフォーマンス上の利点を提供します。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単Goのセット(集合)のイディオムを使用して、特定の人物がプロジェクトチームのメンバーであるかどうかを確認するチームメンバー検証システムを構築してください。このチャレンジでは、comma okイディオムを使用してセット内のメンバーシップをテストする方法を学びます。
2つの入力を受け取ります:
- カンマで区切られたチームメンバーを含む文字列(例:
"Alice,Bob,Charlie,Diana,Eve") - カンマで区切られたチェック対象の人物を含む文字列(例:
"Bob,Frank,Alice,Grace,Charlie")
あなたのタスクは以下の通りです:
- Goのイディオムである
map[string]struct{}を使用して、チームメンバーを格納するセットを作成します。 - 最初の入力文字列をカンマで分割して解析し、個々のチームメンバー名を取得します。
- 空の構造体リテラル
{}を値として使用し、各チームメンバーをセットに追加します。 - 2番目の入力文字列をカンマで分割して解析し、検証する人物のリストを取得します。
- チェック対象の各人物について、comma okイディオム
_, ok := teamSet[person]を使用してメンバーシップをテストします。 - チェックされた各人物の検証結果を表示します:
- その人物がチームにいる場合:
"[person] is on the team" - その人物がチームにいない場合:
"[person] is not on the team"
- その人物がチームにいる場合:
- 全員のチェックが終わった後、サマリーを表示します:
"Team size: [team_member_count]""People checked: [people_checked_count]""Team members found: [found_count]""Non-team members: [not_found_count]"
入力文字列をカンマで分割するには strings パッケージを使用してください。このチャレンジは、comma okイディオムがGoのセットにおけるメンバーシップ確認において、値とキーが存在するかどうかを示すブール値の両方を返す、安全で効率的な方法であることを示しています。
チートシート
セット(マップ)内に要素が存在するかどうかを確認するには、「comma ok」イディオムを使用します。
_, ok := colors["red"]
if ok {
fmt.Println("Red is in the set")
} else {
fmt.Println("Red is not in the set")
}アンダースコア _ は、キーが存在するかどうかを示す boolean 型の ok 変数のみが必要なため、値を破棄します。
このパターンは、if 文の中で直接使用することもできます。
if _, exists := colors["blue"]; exists {
fmt.Println("Blue is in the set")
}自分で試してみよう
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 イディオムを使用して各人物を確認する
// 検証結果と概要を表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。