🆗

Goでmapのキーをsliceとして取り出す方法

2024/01/24に公開

おすすめできる方法が2種類ある。どちらもほぼ同じなので、好みによって選べばよいと思う。

(1) maps.Keys()を使う

golang.org/x/exp/mapsをインポートする必要がある。Go 1.21以降ではmaps自体は標準ライブラリとして採用されているが、Keysは除外されているため、今後もgolang.org/x/exp/mapsを使う必要がある。

なお、キーの順番は保証されない(ランダムになる)ので注意。メリットとしては、一目でkeyのsliceを取得していることが分かりやすいことがある。また、Genericsによってキーがstringの場合は[]string、intの場合は[]intといったように戻り値の型が自動で付いて使いやすい。

package main

import (
	"fmt"

	"golang.org/x/exp/maps"
)

func main() {
	m := map[string]int{"hoge": 0, "fuga": 1}
	keys := maps.Keys(m)
	fmt.Printf("%v", keys)
}

// -> [fuga hoge]

Playground

(2) for-rangeとappendを使う

何もインポートせずに動く。例によってキーの順番は保証されない(ランダムになる)ので注意。

ちなみに、(1)で紹介したmaps.Keysの実装はほぼこれと同じである。(ソースコード)

package main

import "fmt"

func main() {
	m := map[string]int{"hoge": 0, "fuga": 1}
	keys := make([]string, 0, len(m))
	for k := range m {
		keys = append(keys, k)
	}

	fmt.Printf("%v", keys)
}
// -> [hoge fuga]

Playground

参考記事

Discussion