map[string]Fooから文字列のソートされたスライスを返す関数を作成しました。文字列をキーとして持つマップである任意のタイプから文字列のソートされたスライスを返すことができるジェネリックルーチンを作成するための最良の方法は何であるか興味があります。
インターフェイス仕様を使用してそれを行う方法はありますか?たとえば、次のようなことを行う方法はありますか?
type MapWithStringKey interface {
<some code here>
}
上記のインターフェイスを実装するには、型にキーとして文字列が必要です。次に、型を満たすためのキーのソートされたリストを返すジェネリック関数を書くことができます。
これは、reflectモジュールを使用した現在の最良のソリューションです。
func SortedKeys(mapWithStringKey interface{}) []string {
keys := []string{}
typ := reflect.TypeOf(mapWithStringKey)
if typ.Kind() == reflect.Map && typ.Key().Kind() == reflect.String {
switch typ.Elem().Kind() {
case reflect.Int:
for key, _ := range mapWithStringKey.(map[string]int) {
keys = append(keys, key)
}
case reflect.String:
for key, _ := range mapWithStringKey.(map[string]string) {
keys = append(keys, key)
}
// ... add more cases as needed
default:
log.Fatalf("Error: SortedKeys() does not handle %s\n", typ)
}
sort.Strings(keys)
} else {
log.Fatalln("Error: parameter to SortedKeys() not map[string]...")
}
return keys
}
コンパイル時にmapWithStringKeyパラメーターの正確な型を知っている必要がありますが、サポートされている型ごとに型アサーションをコーディングする必要があります。