私はセットを持っている必要がある「The go programming lanaguage」演習#1.4を解決しようとしています。セットタイプを作成できますが、言語にセットタイプが付属しないのはなぜですか?グアバも生まれたグーグルから来て、言語設計者が基本的なデータ構造のサポートを追加することを選択しなかったのはなぜですか?なぜあなたはユーザーに、セットとして非常に基本的な何かのために独自の実装を作成することを強制しますか?
一部には、Goにはジェネリックがないため(すべてのタイプに対して1つのセットタイプが必要になるか、リフレクションにフォールバックしますが、これはかなり非効率的です)。
一部には、必要なのが「個々の要素をセットに追加/削除」し、「比較的スペース効率が良い」場合、map[yourtype]bool
を使用するだけでかなりの部分を得ることができます(そして、要素のtrue
セット)、またはスペース効率を高めるために、空の構造体を値として使用し、_, present = the_setoid[key]
を使用して存在を確認できます。
1つの理由は、マップからセットを簡単に作成できることです。
s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element
delete(s, 2) // remove element
連合
s_union := map[int]bool{}
for k, _ := range s1{
s_union[k] = true
}
for k, _ := range s2{
s_union[k] = true
}
交差点
s_intersection := map[int]bool{}
for k,_ := range s1 {
if s2[k] {
s_intersection[k] = true
}
}
他のすべての集合演算を実装するのはそれほど難しくありません。
Vatineが書いたように:goにはジェネリックが欠けているため、標準ライブラリではなく言語の一部である必要があります。そのためには、キーワードセット、ユニオン、インターセクション、差、サブセットで言語を汚染する必要があります...
もう1つの理由は、セットの「正しい」実装が何であるかがまったく明確ではないということです。
機能的なアプローチがあります:
func IsInEvenNumbers(n int) bool {
if n % 2 == 0 {
return true
}
return false
}
これはすべて偶数のintのセットです。それは非常に効率的なルックアップを持ち、機能的な構成によって簡単に統合、交差、差分、サブセットを行うことができます。
値に関連する何かを保存するため、マップにはその問題はありません。