4

Goを使用してから数日しか経っていません。さまざまな構造タイプが定義されており、それぞれに日付が含まれています。

どういうわけか、これらの構造を日付順に処理する必要がありますが、その順序は複数の異なる構造タイプにまたがる必要があります。Pythonのような動的型付け言語では、日付でキー設定されたすべてのオブジェクトのハッシュ(または、リストが一意でない場合はリストのハッシュ)を簡単に作成できます。Cでは、ポインターの和集合またはvoid*を使用できます。しかし、私はGoでこれをどのように行うかについて行き詰まっています。

各タイプのソートされたリストを保持し、手動でマージソートを実行できると思います。不格好なようですか?

この種の状況の処理について私が読んだことは、インターフェースの使用を指しているように見えますが、この状況でのインターフェースの使用方法は実際にはわかりません。

議論のために、私が次のようなものを持っているとしましょう:

type A struct {
    Date string
    Info string
}

type B struct {
    Date string
    Info int
}

(実際には、より多くの構造があり、複数のフィールドがあるとより複雑になります)、それぞれの(ソートされていない)配列の内容を日付順に印刷する必要があります。

不均一なオブジェクトタイプへのリスト(日付、ポインター)のペアを作成する方法はありますか?


以下の最初の提案ごとに:

package main
import "fmt"

type A struct {
    Date string
    Info string
}
func (x *A) GetDate() string {
    return x.Date
}
type B struct {
    Date string
    Info int
}
func (x *B) GetDate() string {
    return x.Date
}

type Dater interface {
    GetDate() string
}

type Daters []Dater
func (s Daters) Len() int      { return len(s) }
func (s Daters) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
type ByDate struct{ Daters }
func (s ByDate) Less(i, j int) bool {
    return s.Daters[i].GetDate() < s.Daters[j].GetDate()
}   

func main() {
    // lista and listb are just examples. They really come from elsewhere
    lista := []A{{"2012/08/01", "one"}, {"2012/08/03", "three"}}
    listb := []B{{"2012/08/02", 2}, {"2012/08/04", 4}}

    x := make([]Dater, len(lista) + len(listb))
    index := 0
    for i := range(lista) {
        x[index] = &lista[i]
        index++
    }
    for i := range(listb) {
        x[index] = &listb[i]
        index++
    }
    sort.Sort(ByDate{x})
    for _,v := range(x) {
        fmt.Printf("%#v\n", v)
    }
}

それはうまくいきます!ですから、インターフェースの基本的な使い方は問題ありません。インターフェースについてもう少し理解し始めています。ありがとうございます。

注:xの作成はかなり醜いです。よりクリーンで慣用的な方法がわかりませんか?

4

2 に答える 2

3

メソッド(Dateを返すgetDate()など)を使用してインターフェイス(Datedなど)を定義します。次に、すべての構造体(A、B、C)に日付付きインターフェイスを実装させます。次に、タイプ値を保持するためにuse[]Datedを定義できます。

実装を簡素化するために、パッケージの「time」と「sort」を確認することをお勧めします。

于 2012-09-17T03:04:35.853 に答える
0

埋め込みを使用できる場合があります。

日付だけを含む構造体を定義し、それを他の構造体に埋め込みます。そうすれば、GetDate() を 1 回実装するだけで済みます。他の構造体を変更せずに、いつでも Date 構造体を拡張することもできます。

package main

type Dater interface {
    GetDate() string
}

type Date struct {
    Date string
}

func (d *Date) GetDate() string {
    return d.Date
}

type A struct {
    Date
    Info string
}

type B struct {
    Date
    Info []byte
}

type C struct {
    Date
    Info int32
}

A、B、および C で GetDate() を呼び出すことができるようになりました。

于 2012-09-17T07:11:24.800 に答える