php 편집기 Xigua에서는 Go 언어에서 일반 인스턴스화 유형 매개변수의 0이 아닌 포인터를 사용하는 방법을 소개합니다. Go 언어에서 제네릭은 코드의 유연성과 재사용성을 높일 수 있는 강력한 기능입니다. 일반 함수나 메서드에서 0이 아닌 포인터를 인스턴스화해야 하는 경우 이를 달성하기 위해 유형 어설션과 리플렉션을 사용할 수 있습니다. 이러한 기술을 사용하면 특정 유형의 유형 매개변수를 기반으로 런타임에 0이 아닌 포인터 인스턴스를 생성할 수 있으므로 제네릭의 유연성과 다양성을 얻을 수 있습니다. 구체적인 구현 방법을 자세히 살펴보겠습니다.
이제 golang/go:master
에서 유형 매개변수를 사용할 수 있으므로 시도해 보기로 했습니다. 유형 매개변수 제안에서 찾을 수 없는 한계에 부딪힌 것 같습니다. (아니면 제가 놓쳤나봐요).
인터페이스 유형 제약 조건을 사용하여 일반 유형 값 조각을 반환하는 함수를 작성하고 싶습니다. 전달된 유형이 포인터 수신기를 사용한 구현인 경우 이를 어떻게 인스턴스화합니까?
으아아아 *Count
类型作为 T
调用上述 SetGetterSlice()
函数时,此代码将在调用 Set(v)
时出现混乱。 (Go2go 游乐场)毫不奇怪,因为基本上代码创建了 nil
포인터 조각을 사용하는 경우:
이 아이디어는 작동하지 않습니다. 가리키는 값을 인스턴스화하는 쉬운 방법을 찾을 수 없는 것 같습니다.
out[i] = new(T)
将导致编译失败,因为它返回 *T
,其中类型检查器希望查看 T
. *new(T)
进行编译,但会导致相同的运行时恐慌,因为 new(T)
返回 **Count
在这种情况下,其中指向 Count
的指针仍然是 nil
. T
에 대한 포인터 조각으로 변경하면 컴파일이 실패합니다. 지금까지 제가 찾은 유일한 해결책은 생성자를 일반 함수에 전달하도록 요구하는 것입니다. 그러나 그것은 잘못된 느낌이고 약간 지루한 느낌입니다. func F(T interface{})() []T
가 완벽하게 유효한 구문이라면 왜 필요한가요?
내 질문(우선순위):
기본적으로 T
을 포인터 유형으로 변환할 수 있도록 하려면 제약 조건에 유형 매개변수를 추가해야 합니다. 가장 기본적인 형태의 기술은 다음과 같습니다(익명성 제한 포함):
놀이터:https://www.php.cn/link/24aef8cb3281a2422a59b51659f1ad2e
단계별 솔루션
제약 사항 SetGetter
已经声明了类型参数 V
이므로 위의 예를 약간 수정합니다.
그런 다음 SetGetterSlice
函数,其类型参数为 T any
,其目的只是实例化约束 SetGetter
을 정의하세요.
그런 다음 식 &out[i]
을 포인터 유형으로 캐스팅하고 포인터 수신기에서 메서드를 성공적으로 호출할 수 있습니다.
전체 프로그램:
CFE57E536C89530D9A8C38E10967A10D이제 SetGetterSlice
에는 원래 V
와 SetGetterSlice
现在需要三个类型参数:原始 V
加上 T
(带有指针接收器的类型)和 PT
(新约束)。然而,当您调用该函数时,您可以省略第三个 - 通过类型推断,实例化 PT SetGetter[V,T]
所需的类型参数 V
和 T
(포인터 수신기가 있는 유형) 및 PT
( 새로운 제약). 그러나 함수를 호출할 때 세 번째 항목인 유형 추론을 통해 PT SetGetter[V,T]
를 인스턴스화하는 데 필요한 유형 매개변수 V
와
으아아아 놀이터:https://www.php.cn/link/6b061fc28f7473418a006dfa832708b1
🎜위 내용은 일반 Go를 사용하여 유형 매개변수에 대한 0이 아닌 포인터를 인스턴스화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!