IT

지도에서 키 조각 가져 오기

lottoking 2020. 5. 15. 08:22
반응형

지도에서 키 조각 가져 오기


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는 표현력이 뛰어난 언어가 아닙니다.


다른 답변에서 설명한 세 가지 방법에 대한 스케치 벤치 마크를 만들었습니다.

키를 당기기 전에 슬라이스를 미리 할당하는 것이 appending 보다 빠르지 만 놀랍게도이 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

반응형