일반 유형 매개변수를 특정 유형으로 변환할 수 없습니다
Go에서는 제네릭을 사용할 때 제네릭 유형 매개변수와 일반 유형 매개변수 간의 관계를 이해하는 것이 중요합니다. 그들의 제약. 이 경우 문제는 일반 유형 매개변수(*T)에 대한 포인터를 특정 인터페이스(스트링거)를 기대하는 함수에 대한 인수로 전달하려고 시도하는 데서 발생합니다.
오류 메시지에서는 *T 유형 매개변수에 대한 포인터이지만 스트링거 인터페이스를 구현하지 않습니다. 이는 T(FooBar)의 제약조건과 스트링거 인터페이스가 본질적으로 연결되어 있지 않기 때문입니다. 이 문제를 해결하려면 둘 사이의 관계를 설정해야 합니다.
해결책 1: 형식 안전성 주장(안전하지 않음)
한 가지 해결책은 *T가 다음과 같다고 주장하는 것입니다. any()를 사용하는 스트링거. 이를 통해 포인터를 인수로 전달할 수 있지만 유형 안전성이 희생되고 런타임 패닉이 발생할 수 있습니다.
func blah[T FooBar]() { t := new(T) do(any(t).(stringer)) }
해결책 2: FooBar 매개변수화(유형 안전)
또 다른 해결책은 FooBar 인터페이스를 일반 유형 T로 매개변수화하여 FooBar의 유형 매개변수와 전달하는 유형 매개변수가 어쩌구 일치. 이 접근 방식은 유형 안전성을 유지하고 스트링거 인터페이스를 구현하는 특정 유형에 포인터를 전달할 수 있게 해줍니다.
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar[T]]() { var t T do(U(&t)) }
설명:
이 솔루션을 사용하면 스트링거 인터페이스를 구현하는 특정 유형의 인스턴스를 전달하고 인스턴스화 중에 유형 안전성을 보장할 수 있습니다.
위 내용은 Go에서 일반 유형 포인터를 특정 인터페이스로 안전하게 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!