> 백엔드 개발 > Golang > Go(1.20 이전)에서 일반 연결 목록을 맵 키로 사용할 수 없는 이유는 무엇입니까?

Go(1.20 이전)에서 일반 연결 목록을 맵 키로 사용할 수 없는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-18 12:50:13
원래의
951명이 탐색했습니다.

Why Can't Generic Linked Lists Be Used as Map Keys in Go (Prior to 1.20)?

Go Generics: 맵 키에 대한 유형 제약 조건

질문:

왜 다음이 수행됩니까? 일반 연결 목록을 맵으로 사용할 때 코드가 컴파일되지 않습니다. key?

type List[X any] interface {
    isList()
}

type Cons[X any] struct {
    Data X
    Next List[X]
}

func (Cons[X]) isList() {}

func main() {
    x := Cons[int]{5, Nil[int]{}}
    m := map[List[int]]string{}
    m[x] = "Hi"
    fmt.Println(m[x])
    fmt.Println(id(x))
}
로그인 후 복사

답변:

Go 1.18 및 1.19에서는 맵 키에 대해 미리 선언된 비교 제약 조건이 필요하며 엄격하게 비교 가능한 유형으로 사용을 제한합니다. 런타임 시 당황하지 않고 == 및 != 비교를 지원합니다. 인터페이스는 같음 비교를 지원하더라도 무한한 유형 집합을 갖기 때문에 비교 기능을 구현하지 않습니다.

List[X] 인터페이스 자체는 맵 키로 사용할 수 있지만 Cons[X] 구조체는 List[X] 필드가 포함되어 있으므로 비교 가능한 항목을 구현하지 않습니다. 맵 키로 사용하기에 적합한 유형을 식별하는 데 사용할 수 있는 약한 제약 조건은 없습니다.

그러나 Go 1.20(2023년 2월)에서는 이 동작이 수정되었습니다. Comparable은 이제 비교로 인해 런타임에 패닉이 발생할 수 있더라도 언어 사양에 따라 비교할 수 있는 모든 유형을 허용합니다. 이렇게 하면 코드가 성공적으로 컴파일될 수 있습니다.

대체 제약 조건:

isList() 메서드를 포함하는 제약 조건을 사용해야 하는 경우 직접 정의할 수 있습니다.

type List interface {
    comparable
    isList() bool
}
로그인 후 복사

그런 다음 맵 키 구조체가 선언하는 대신 이 List 인터페이스를 구현하도록 합니다. 인터페이스 필드입니다.

위 내용은 Go(1.20 이전)에서 일반 연결 목록을 맵 키로 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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