Menu
Coddy logo textTech

要素の存在確認

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実装を活用することで、真のセットデータ構造のパフォーマンス上の利点を提供します。

quiz icon腕試し

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

quiz icon腕試し

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

quiz icon腕試し

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

challenge icon

チャレンジ

簡単

Goのセット(集合)のイディオムを使用して、特定の人物がプロジェクトチームのメンバーであるかどうかを確認するチームメンバー検証システムを構築してください。このチャレンジでは、comma okイディオムを使用してセット内のメンバーシップをテストする方法を学びます。

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

  • カンマで区切られたチームメンバーを含む文字列(例:"Alice,Bob,Charlie,Diana,Eve"
  • カンマで区切られたチェック対象の人物を含む文字列(例:"Bob,Frank,Alice,Grace,Charlie"

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

  1. Goのイディオムである map[string]struct{} を使用して、チームメンバーを格納するセットを作成します。
  2. 最初の入力文字列をカンマで分割して解析し、個々のチームメンバー名を取得します。
  3. 空の構造体リテラル {} を値として使用し、各チームメンバーをセットに追加します。
  4. 2番目の入力文字列をカンマで分割して解析し、検証する人物のリストを取得します。
  5. チェック対象の各人物について、comma okイディオム _, ok := teamSet[person] を使用してメンバーシップをテストします。
  6. チェックされた各人物の検証結果を表示します:
    • その人物がチームにいる場合:"[person] is on the team"
    • その人物がチームにいない場合:"[person] is not on the team"
  7. 全員のチェックが終わった後、サマリーを表示します:
    • "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 イディオムを使用して各人物を確認する
	// 検証結果と概要を表示する
	
}
quiz icon腕試し

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

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