119

マップ m がある場合、値 v のスライスを取得するより良い方法はありますか

package main
import (
  "fmt"
)

func main() {
    m := make(map[int]string)

    m[1] = "a"
    m[2] = "b"
    m[3] = "c"
    m[4] = "d"

    // Can this be done better?
    v := make([]string, len(m), len(m))
    idx := 0
    for  _, value := range m {
       v[idx] = value
       idx++
    }

    fmt.Println(v)
 }

マップの組み込み機能はありますか? Go パッケージに関数はありますか、それとも必要な場合に実行するのに最適なコードはありますか?

4

5 に答える 5

74

jimtの投稿への追加として:

append値をインデックスに明示的に割り当てるのではなく、次のように使用することもできます。

m := make(map[int]string)

m[1] = "a"
m[2] = "b"
m[3] = "c"
m[4] = "d"

v := make([]string, 0, len(m))

for  _, value := range m {
   v = append(v, value)
}

長さはゼロ (要素はまだ存在しない) ですが、容量 (割り当てられたスペース) は の要素数で初期化されることに注意してくださいm。これappendにより、スライスの容量がなくなるたびにメモリを割り当てる必要がなくなりvます。

makeまた、容量値なしでスライスを作成しappend、それ自体にメモリを割り当てることもできます。

于 2012-11-17T05:20:16.463 に答える
72

残念だけど違う。これを行う組み込みの方法はありません。

補足として、スライスの作成で容量引数を省略できます。

v := make([]string, len(m))

ここでは、容量は長さと同じであることを意味します。

于 2012-11-16T18:52:55.513 に答える