이기종 값 유형으로 지도 사용 확장
Go의 지도는 키-값 쌍을 관리하기 위한 강력한 데이터 구조를 제공합니다. 그러나 키 유형은 동일하지만 값 유형이 다양한 맵 컬렉션으로 작업할 때 기본 제공 지원 부족이 제한이 될 수 있습니다.
다음 코드 조각을 고려하세요.
func useKeys(m map[string]interface{}) { //something with keys here }
의도는 값 유형에 관계없이 문자열 키 유형을 가진 모든 맵의 키에 대해 작동하는 일반 함수를 작성하는 것입니다. 그러나 위와 같은 시도는 유형 불일치로 인해 실패합니다.
근본적인 문제는 Go의 맵 유형과 슬라이스 유형에 공분산이 없다는 것입니다. 일반 언어와 달리 Go는 공변 하위 유형 지정을 지원하지 않습니다. 즉, 파생 키 또는 값 유형이 있는 맵은 기본 키 또는 값 유형이 있는 맵과 호환되지 않습니다.
실용적 접근 방식
이 문제에 대한 명쾌한 해결책은 없지만 실용적인 방법은 있습니다. 해결 방법:
명시적 유형 처리:
한 가지 접근 방식은 각 특정 지도 유형에 대해 별도의 함수를 만드는 것입니다. 예:
func useKeysInts(m map[string]int) { //operations on string keys and int values } func useKeysDoubles(m map[string]double) { //operations on string keys and double values }
반사 기반 접근 방식:
반사를 사용하면 지도의 구조와 내용을 검사하고 조작할 수 있는 더욱 동적인 솔루션을 제공합니다. 다음 함수는 리플렉션을 사용하여 모든 맵에서 키를 추출합니다.
func useKeysReflect(m interface{}) { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { fmt.Println("not a map!") return } keys := v.MapKeys() fmt.Println(keys) }
이 접근 방식은 알 수 없거나 동적으로 생성된 유형의 맵 키에 대한 작업을 수행해야 할 때 유용합니다.
리플렉션 기반 접근 방식은 필요한 추가 처리로 인해 일부 런타임 오버헤드가 발생할 수 있다는 점에 주목할 가치가 있습니다.
위 내용은 키 유형은 동일하지만 값 유형이 다른 Go 맵을 어떻게 작업할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!