> 백엔드 개발 > Golang > 키 유형은 동일하지만 값 유형이 다른 Go 맵을 어떻게 작업할 수 있나요?

키 유형은 동일하지만 값 유형이 다른 Go 맵을 어떻게 작업할 수 있나요?

Susan Sarandon
풀어 주다: 2024-12-29 04:52:11
원래의
349명이 탐색했습니다.

How Can I Work with Go Maps Having the Same Key Type but Different Value Types?

이기종 값 유형으로 지도 사용 확장

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿