2

Go で一般的な配列/スライスの重複排除を作成する方法はあり[]intますか? ( http://rosettacode.org/wiki/Remove_duplicate_elements#Goから):

func uniq(list []int) []int {
  unique_set := make(map[int] bool, len(list))
  for _, x := range list {
     unique_set[x] = true
   }
  result := make([]int, len(unique_set))
  i := 0
  for x := range unique_set {
     result[i] = x
    i++
  }
  return result
}

しかし、それを拡張して任意の配列をサポートする方法はありますか? 次のような署名付き:

func deduplicate(a []interface{}) []interface{}

私はあなたがその署名でその関数を書くことができることを知っていますが、実際にはそれを で使用することはできませ[]intん。この新しい配列を調べて、すべてを new に入れます。 []interface{}[]int[]interface{}[]int

私の質問は、これを行うためのより良い方法はありますか?

4

3 に答える 3

2

Go で実装されているのを私が見た唯一の方法は、clipperhouse/genプロジェクトを使用することです。

gen は、C# の Linq と JavaScript のアンダースコア ライブラリからインスピレーションを得て、いくつかのジェネリックのような機能を Go に持ち込もうとする試みです。

このテストを参照してください:

// Distinct returns a new Thing1s slice whose elements are unique. See: http://clipperhouse.github.io/gen/#Distinct
func (rcv Thing1s) Distinct() (result Thing1s) {
    appended := make(map[Thing1]bool)
    for _, v := range rcv {
        if !appended[v] {
            result = append(result, v)
            appended[v] = true
        }
    }
    return result
}

ただしclipperhouse.github.io /gen/ で説明されているように:

genは、コマンド ラインを使用して、開発時に型のコードを生成します。

gen はインポートではありません。生成されたソースはプロジェクトの一部になり、外部依存関係はありません。

于 2014-04-24T17:38:50.957 に答える
1

インターフェイスを介してこれに近いことを行うことができます。UniqId() []byte などの func を必要とする "DeDupable" などのインターフェイスを定義します。これを使用して、dup の削除を行うことができます。あなたのuniq funcは[]DeDupableを取り、それに取り組みます

于 2014-04-24T18:19:51.840 に答える