문제:
Go에서 맵 작업을 할 때 다음 키를 사용하는 것이 바람직한 경우가 많습니다. 같은 유형이지만 다른 유형의 값입니다. 그러나 인터페이스{}를 값 유형으로 사용하는 키 유형을 사용하는 함수를 생성하려고 하면 제약이 있습니다.
접근 실패:
func main() { mapOne := map[string]int mapTwo := map[string]double mapThree := map[string]SomeStruct useKeys(mapOne) } func useKeys(m map[string]interface{}) { //something with keys here }
위 코드는 유형 불일치로 인해 컴파일되지 않습니다. Go의 맵은 공변적이지 않습니다. 즉, 동일한 키 유형으로 다른 값 유형을 허용할 수 없습니다.
해결책:
이 문제에 대한 우아한 해결책은 없습니다. Go의 고유한 한계로 인해 리플렉션을 사용하는 해결 방법이 있습니다.
func useKeys(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!