golang에서 맵에서 값 조각을 얻는 좋은 방법이 있습니까?
맵 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 패키지에 함수가 있습니까? 아니면 이것이 내가 필요한 경우 수행 할 수있는 가장 좋은 코드입니까?
불행하게도. 이를 수행하는 기본 제공 방법은 없습니다.
참고로, 슬라이스 생성에서 용량 인수를 생략 할 수 있습니다.
v := make([]string, len(m))
용량은 여기의 길이와 동일 함을 의미합니다.
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)
}
길이는 0 (아직 요소가 없음)이지만 용량 (할당 된 공간)은의 요소 수로 초기화됩니다 m. 이렇게 append하면 슬라이스 용량이 부족할 때마다 메모리를 할당 할 필요가 없습니다 v.
make용량 값이없는 슬라이스 도 append자체 메모리를 할당 할 수 있습니다.
내가 현재 아는 한, go에는 최소한 / two / 복사본을 만들지 않고 문자열 / 바이트를 결과 문자열에 연결하는 방법이 없습니다.
모든 문자열 값이 const이기 때문에 현재 [] 바이트를 늘려야합니다. 그런 다음 언어가 '축복 된'문자열 객체를 생성하도록 문자열 내장을 사용해야합니다. 어딘가에 참조가있을 수 있으므로 버퍼를 복사합니다. [] 바이트를 뒷받침하는 주소로.
[] 바이트가 적합하면 하나의 할당을 수행하고 복사를 수행하여 자신을 호출함으로써 bytes.Join 함수에 대해 약간의 리드를 얻을 수 있습니다.
package main
import (
"fmt"
)
func main() {
m := make(map[int]string)
m[1] = "a" ; m[2] = "b" ; m[3] = "c" ; m[4] = "d"
ip := 0
/* If the elements of m are not all of fixed length you must use a method like this;
* in that case also consider:
* bytes.Join() and/or
* strings.Join()
* They are likely preferable for maintainability over small performance change.
for _, v := range m {
ip += len(v)
}
*/
ip = len(m) * 1 // length of elements in m
r := make([]byte, ip, ip)
ip = 0
for _, v := range m {
ip += copy(r[ip:], v)
}
// r (return value) is currently a []byte, it mostly differs from 'string'
// in that it can be grown and has a different default fmt method.
fmt.Printf("%s\n", r)
}
이 maps패키지 를 사용할 수 있습니다 .
go get https://github.com/drgrib/maps
그럼 당신이 전화해야 할 것은
values := maps.GetValuesIntString(m)
일반적인 map조합에 대해 형식이 안전합니다 . 동일한 패키지에서 도구 generate를 map사용하는 다른 유형에 대해 다른 유형 안전 함수를 사용할 수 있습니다 mapper.
전체 공개 : 나는이 패키지의 작성자입니다. 이 기능을 map반복적으로 다시 작성했기 때문에 만들었습니다 .
'Nice programing' 카테고리의 다른 글
| 파이썬 파일을 실행할 때 어떻게 독 스트링을 인쇄 할 수 있습니까? (0) | 2020.11.08 |
|---|---|
| Task에서 예외를 포착하는 가장 좋은 방법은 무엇입니까? (0) | 2020.11.08 |
| 빌드 이벤트 명령 줄에 주석을 추가하는 올바른 방법은 무엇입니까? (0) | 2020.11.07 |
| 흐릿한 투명한 배경 효과 만들기 (0) | 2020.11.07 |
| 마우스를 올려도 "youtube"상단의 막대를 숨기는 방법은 무엇입니까? (0) | 2020.11.07 |