web-dev-qa-db-ja.com

golangなぜデータ構造が設定されていないのか

私はセットを持っている必要がある「The go programming lanaguage」演習#1.4を解決しようとしています。セットタイプを作成できますが、言語にセットタイプが付属しないのはなぜですか?グアバも生まれたグーグルから来て、言語設計者が基本的なデータ構造のサポートを追加することを選択しなかったのはなぜですか?なぜあなたはユーザーに、セットとして非常に基本的な何かのために独自の実装を作成することを強制しますか?

85
anjanb

一部には、Goにはジェネリックがないため(すべてのタイプに対して1つのセットタイプが必要になるか、リフレクションにフォールバックしますが、これはかなり非効率的です)。

一部には、必要なのが「個々の要素をセットに追加/削除」し、「比較的スペース効率が良い」場合、map[yourtype]boolを使用するだけでかなりの部分を得ることができます(そして、要素のtrueセット)、またはスペース効率を高めるために、空の構造体を値として使用し、_, present = the_setoid[key]を使用して存在を確認できます。

61
Vatine

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
  }
}

他のすべての集合演算を実装するのはそれほど難しくありません。

45
Salvador Dali

もう1つの可能性は、少なくとも1つの package があるビットセットを使用するか、組み込みの big パッケージを使用することです。この場合、基本的に、オブジェクトをインデックスに変換する方法を定義する必要があります。

4
Will Fitzgerald

Vatineが書いたように:goにはジェネリックが欠けているため、標準ライブラリではなく言語の一部である必要があります。そのためには、キーワードセット、ユニオン、インターセクション、差、サブセットで言語を汚染する必要があります...

もう1つの理由は、セットの「正しい」実装が何であるかがまったく明確ではないということです。

  1. 機能的なアプローチがあります:

    func IsInEvenNumbers(n int) bool {
        if n % 2 == 0 {
            return true
        }
       return false
    }
    

これはすべて偶数のintのセットです。それは非常に効率的なルックアップを持ち、機能的な構成によって簡単に統合、交差、差分、サブセットを行うことができます。

  1. または、Daliが示したようなhas-likeアプローチを行います。

値に関連する何かを保存するため、マップにはその問題はありません。

2
0x434D53