답변:
예를 들어
package main
func main() {
mymap := make(map[int]string)
keys := make([]int, 0, len(mymap))
for k := range mymap {
keys = append(keys, k)
}
}
Go에서 효율적으로 사용하려면 메모리 할당을 최소화하는 것이 중요합니다.
mymap
로컬 변수 아닌 (따라서 / 성장 감소의 대상이다), 이것이 유일한 적절한 해결책이다 - 그것은 크기 경우되도록 mymap
초기화 간의 변경 keys
및 for
루프 임의 OUT- 없을 것 경계 문제.
이것은 오래된 질문이지만 여기에 2 센트가 있습니다. PeterSO의 대답은 약간 간결하지만 약간 덜 효율적입니다. 이미 얼마나 큰지 알고 있으므로 append를 사용할 필요조차 없습니다.
keys := make([]int, len(mymap))
i := 0
for k := range mymap {
keys[i] = k
i++
}
대부분의 상황에서 아마도 큰 차이는 없지만 아마도 더 많은 작업은 아니며 내 테스트 (무작위 1,000,000 개의 int64
키가 있는 맵을 사용한 다음 각 방법으로 키 배열을 10 번 생성)에서 append를 사용하는 것보다 직접 배열 멤버를 할당하는 데 20 % 빠릅니다.
용량을 설정하면 재 할당이 제거되지만 append는 여전히 각 추가 용량에 도달했는지 확인하기 위해 추가 작업을 수행해야합니다.
for i, k := range mymap{
. 그렇게하면 i ++이 필요하지 않습니까?
i, k := range mymap
, 다음 i
키되며 k
맵에서 그 키에 해당하는 값이 될 것입니다. 실제로 키 조각을 채우는 데 도움이되지는 않습니다.
패키지 "reflect"에서 struct의 []Value
방법 MapKeys
에 따라 유형이있는 키 배열을 가져올 수도 있습니다 Value
.
package main
import (
"fmt"
"reflect"
)
func main() {
abc := map[string]int{
"a": 1,
"b": 2,
"c": 3,
}
keys := reflect.ValueOf(abc).MapKeys()
fmt.Println(keys) // [a b c]
}
[]string
있습니까?
이 작업을 수행하는 더 좋은 방법은 다음을 사용하는 것입니다 append
.
keys = []int{}
for k := range mymap {
keys = append(keys, k)
}
그 외에는 운이 좋지 않습니다. Go는 표현력이 뛰어난 언어가 아닙니다.
keys = make([]int, 0, len(mymap))
것은 할당을 제거 할 것이지만 여전히 느릴 것으로 예상합니다.
다른 답변에서 설명한 세 가지 방법에 대한 스케치 벤치 마크를 만들었습니다.
키를 당기기 전에 슬라이스를 미리 할당하는 것이 append
ing 보다 빠르지 만 놀랍게도이 reflect.ValueOf(m).MapKeys()
방법은 후자보다 훨씬 느립니다.
❯ go run scratch.go
populating
filling 100000000 slots
done in 56.630774791s
running prealloc
took: 9.989049786s
running append
took: 18.948676741s
running reflect
took: 25.50070649s
여기에 코드입니다 : https://play.golang.org/p/Z8O6a2jyfTH (. 너무 오래, 너무 잘 로컬로 실행 걸립니다 주장 놀이터 중단한다에서 실행이)
keysAppend
기능, 당신은의 용량을 설정할 수 keys
와 배열 make([]uint64, 0, len(m))
대폭 나를 위해 그 기능의 성능을 변경.
https://play.golang.org/p/dx6PTtuBXQW 방문
package main
import (
"fmt"
"sort"
)
func main() {
mapEg := map[string]string{"c":"a","a":"c","b":"b"}
keys := make([]string, 0, len(mapEg))
for k := range mapEg {
keys = append(keys, k)
}
sort.Strings(keys)
fmt.Println(keys)
}