集合としての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フィードバックを取得できます。ローカル設定は不要です。