0Pricing
Go Academy · レッスン

集合としてのmap

一意な値にmapを使用します

「集合としてのmap」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

GoにはSet型がない

Goには組み込みのset型がありません。一意な値の集合を表す慣用的な方法は、集合の要素をキーにしたマップを使うことです。

boolのマップ

方法の1つはmap[string]boolです。キーが存在し、値がtrueであれば、その要素は集合に含まれています。

package main

import "fmt"

func main() {
	set := map[string]bool{}
	set["apple"] = true
	set["banana"] = true
	fmt.Println(set)
}

メンバーの確認

カンマokを使うか、ブール値を直接読み取って、メンバーの所属を確認します。

package main

import "fmt"

func main() {
	set := map[string]bool{"apple": true}
	fmt.Println(set["apple"])
	fmt.Println(set["cherry"])
}

空の構造体のマップ

よりメモリ効率のよい集合にはmap[string]struct{}を使います。空の構造体は0バイトなので、キーだけを格納できます。

package main

import "fmt"

func main() {
	set := map[string]struct{}{}
	set["x"] = struct{}{}
	_, ok := set["x"]
	fmt.Println("x in set:", ok)
}

空の構造体を使う理由

集合では値は重要ではなく、キーだけが重要です。struct{}{}は値を無視する意図を示し、エントリごとの追加メモリも使用しません。

要素の追加

重複するキーを追加しても効果がないため、集合によって自然に一意性が保たれます。

package main

import "fmt"

func main() {
	set := map[string]struct{}{}
	set["a"] = struct{}{}
	set["a"] = struct{}{}
	fmt.Println("size:", len(set))
}

重複の削除

典型的な用途は、スライスの重複排除です。各要素を集合に追加し、その後、一意なキーを読み出します。

package main

import "fmt"

func main() {
	input := []string{"a", "b", "a", "c", "b"}
	set := map[string]struct{}{}
	for _, v := range input {
		set[v] = struct{}{}
	}
	fmt.Println("unique count:", len(set))
}

一意なスライスの構築

集合と結果用のスライスを組み合わせると、重複を削除しながら最初に現れた順序を維持できます。

package main

import "fmt"

func main() {
	input := []int{1, 2, 1, 3, 2}
	seen := map[int]struct{}{}
	result := []int{}
	for _, v := range input {
		if _, ok := seen[v]; !ok {
			seen[v] = struct{}{}
			result = append(result, v)
		}
	}
	fmt.Println(result)
}

集合の共通部分

2つの集合に共通する要素を見つけるには、一方を反復処理し、もう一方に存在する要素だけを残します。

package main

import "fmt"

func main() {
	a := map[int]struct{}{1: {}, 2: {}, 3: {}}
	b := map[int]struct{}{2: {}, 3: {}, 4: {}}
	for k := range a {
		if _, ok := b[k]; ok {
			fmt.Println("common:", k)
		}
	}
}

集合からの削除

deleteを使って、集合から要素を取り除きます。

package main

import "fmt"

func main() {
	set := map[string]struct{}{"a": {}, "b": {}}
	delete(set, "a")
	_, ok := set["a"]
	fmt.Println("a in set:", ok)
}

boolとstruct{}の選択

どちらも使用できます。set[x]をブール値として読めることが可読性に役立つ場合はmap[T]boolを使います。値が重要でないことを示し、大きな集合でメモリを節約したい場合はmap[T]struct{}を使います。

確認問題

集合では、map[string]struct{}がmap[string]boolよりよく使われることが多いのはなぜですか。

まとめ

マップを集合として使う:

  • Goには集合型がないため、要素をキーにしたマップを使います
  • map[T]boolまたはmap[T]struct{}を使います
  • 重複排除やメンバー確認に適しています

よくある質問

「集合としてのmap」レッスンは無料ですか?

はい。「集合としてのmap」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「集合としてのmap」で何を学びますか?

一意な値にmapを使用します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「集合としてのmap」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. mapの内部構造
  2. 存在確認
  3. 集合としてのmap
  4. 反復処理と順序
← Go Academyに戻る