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の作成はかなり醜いです。よりクリーンで慣用的な方法がわかりませんか?