지도에서 키 조각 가져 오기
Go의지도에서 키 조각을 가져 오는 더 간단하고 효율적인 방법이 있습니까?
현재지도를 반복하고 키를 슬라이스에 복사하고 있습니다.
i := 0
keys := make([]int, len(mymap))
for k := range mymap {
keys[i] = k
i++
}
예를 들어
package main
func main() {
mymap := make(map[int]string)
keys := make([]int, 0, len(mymap))
for k := range mymap {
keys = append(keys, k)
}
}
Go에서 효율적으로 사용하려면 메모리 할당을 최소화하는 것이 중요합니다.
이것은 오래된 질문이지만 여기에 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는 여전히 각 추가 용량에 도달했는지 확인하기 위해 추가 작업을 수행해야합니다.
패키지 "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]
}
이 작업을 수행하는 더 좋은 방법은 다음을 사용하는 것입니다 append
.
keys = []int{}
for k := range mymap {
keys = append(keys, k)
}
그 외에는 운이 좋지 않습니다. Go는 표현력이 뛰어난 언어가 아닙니다.
다른 답변에서 설명한 세 가지 방법에 대한 스케치 벤치 마크를 만들었습니다.
키를 당기기 전에 슬라이스를 미리 할당하는 것이 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
Here's the code: https://play.golang.org/p/Z8O6a2jyfTH (running it in the playground aborts claiming that it takes too long, so, well, run it locally.)
Visit 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)
}
https://github.com/chenhg5/collection is a package which can help you. like this:
a := map[string]interface{}{
"name": "mike",
"sex": 1,
}
fmt.Println(Collect(a).Keys().ToStringArray())
// Output: []string{"name", "sex"}
참고URL : https://stackoverflow.com/questions/21362950/getting-a-slice-of-keys-from-a-map
'IT' 카테고리의 다른 글
SimpleXMLElement 객체로부터 가치 얻기 (0) | 2020.05.15 |
---|---|
select2 값을 재설정하고 자리 표시 자 표시 (0) | 2020.05.15 |
문자열을 URL 인코딩하는 방법 (0) | 2020.05.15 |
경로에서 File.separator와 슬래시의 차이점 (0) | 2020.05.15 |
목록의 두 요소마다 반복 (0) | 2020.05.15 |