Goにおけるセットの慣用法
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 31/68。
Goには、他の多くのプログラミング言語のような組み込みのセット(集合)データ構造はありません。しかし、Goの開発者はマップを使用してセットをシミュレートするエレガントな解決策を生み出しており、このパターンは非常に一般的になったため、慣習的なGo(idiomatic Go)と見なされています。
Goのセット(集合)のイディオムでは、値ではなくキーのみを対象とするマップを使用します。値として何かを格納する必要があるため、Goプログラマーは空の構造体 struct{} を使用します。基本的なパターンは以下の通りです:
var mySet map[string]struct{}空の構造体 struct{} は、メモリを0バイトしか消費しないため特殊です。これにより、無意味な値にメモリを浪費することなく、何かが存在するかどうかだけを追跡すればよいセット(集合)に最適です。
このアプローチは、マップのキーの基本的な性質、つまり「一意でなければならない」という点を利用しています。セットに項目を追加するとき、実際にはマップにキーを追加していることになります。一意性はマップの動作によって自動的に強制され、真のセットのセマンティクスが得られます。
今後のレッスンでは、この慣用的なGoのパターンを使用して、セット(集合)を作成、操作、および活用する方法を学びます。この手法は、ユニークな項目の追跡、アルゴリズムの実装、および高速なメンバーシップテストが必要な問題の解決のために、Goのコードベースで広く使用されています。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チートシート
Goには組み込みのセット(集合)データ構造はありませんが、慣用的なパターンとしてマップを使用してセットをシミュレートします。
var mySet map[string]struct{}空の構造体 struct{} は、メモリを0バイトしか消費しないため、値の型として使用されます。マップのキーは一意である必要があるため、一意のアイテムを追跡するためのセットのセマンティクスが自動的に提供されます。
自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。