標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

Goの reflect で Perlでいうところの「sorted keys %HASH」的なことをする

とある slack で reflect のよい使用例についての話題が出てました。

reflect を使用したいというケースは、encoding とか O/R mapper 以外となると、ほとんどの場合「interface で済むんじゃね?さもなければプログラマがよく Go 言語を理解していないんじゃね?」という場合が多いのですが…

実は「ちょっとコレはいけるんじゃね?」というコードを前に書いていたので、ちょっと紹介してみます(← お前も実は Go言語を理解していないんじゃね?)

任意の型Tに対する map[string]T という辞書のキーをソートして配列化する関数です。Perl でいうところの sorted keys %HASH ですね。

func SortedKeys(mapInt interface{}) []string {
    values := reflect.ValueOf(mapInt).MapKeys()
    result := make([]string, len(values))
    for i, value1 := range values {
        result[i] = value1.String()
    }
    sort.Strings(result)
    return result
}
// test
func TestSortedKeys(t *testing.T) {
    example := map[string]int{
        "a": 1, "b": 2, "c": 3,
    }

    result := SortedKeys(example)

    if result[0] != "a" ||
        result[1] != "b" ||
        result[2] != "c" {

        t.Fail()
    }
}

nyagos でエイリアスとか環境変数の一覧を表示するところとかに使ってます。一覧表示はキーをソートして表示したいですからね。こういうのって、キーはたいてい string ですけど、値の方は様々な構造体なんですよね。