🆗
Goでmapのキーをsliceとして取り出す方法
おすすめできる方法が2種類ある。どちらもほぼ同じなので、好みによって選べばよいと思う。
maps.Keys()
を使う
(1) 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]
(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]
Discussion