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