제네릭의 유형 안전 고려 사항
Go의 제네릭에서 유형 매개변수 T는 제약 조건 인터페이스 FooBar와 다릅니다. 그러나 이러한 구별은 질문을 제기합니다. 스트링거를 구현하는 유형을 기대하는 함수에 T의 인스턴스를 어떻게 전달할 수 있습니까(예: do)?
오류 이해
"할 인수에서 유형 스트링거로 *T 유형의 변수를 사용할 수 없습니다"라는 오류 메시지는 어쩌구의 매개변수 t가 다음을 구현하는 유형으로 잘못 식별되었음을 나타냅니다. 스트링거. 그러나 T는 본질적으로 이 방법을 보유하지 않습니다.
문제 해결
t를 스트링거로 변환하려면 다음 단계가 필요합니다.
최종 코드
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar]() { var t T do(U(&t)) } func main() { blah[foo]() }
설명
이제 blah가 호출되면 T 유형의 변수 t가 포인터로 선언됩니다. FooBar[T]는 U가 T에 대한 포인터를 포함하는 유형이 되도록 제한합니다. &t를 U로 변환하는 것은 유효하며 FooBar[T](문자열 포함)의 메서드는 수신자 t에서 사용할 수 있습니다.
참고:
FooBar에 유형 매개변수를 사용하면 인수 전달이 가능하고 중간 속임수가 필요하지 않습니다. 예를 들어 blah를 다음과 같이 수정할 수 있습니다.
func blah[T FooBar](t T) { do(t) }
blah(&foo{})로 호출할 수 있습니다.
위 내용은 Go Generics에서 '*T 유형의 변수를 유형 스트링거로 사용할 수 없습니다' 오류를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!