>  기사  >  백엔드 개발  >  일반 Go를 사용하여 유형 매개변수에 대한 0이 아닌 포인터를 인스턴스화하는 방법은 무엇입니까?

일반 Go를 사용하여 유형 매개변수에 대한 0이 아닌 포인터를 인스턴스화하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2024-02-11 17:36:11354검색

如何使用泛型 Go 实例化类型参数的非零指针?

php 편집기 Xigua에서는 Go 언어에서 일반 인스턴스화 유형 매개변수의 0이 아닌 포인터를 사용하는 방법을 소개합니다. Go 언어에서 제네릭은 코드의 유연성과 재사용성을 높일 수 있는 강력한 기능입니다. 일반 함수나 메서드에서 0이 아닌 포인터를 인스턴스화해야 하는 경우 이를 달성하기 위해 유형 어설션과 리플렉션을 사용할 수 있습니다. 이러한 기술을 사용하면 특정 유형의 유형 매개변수를 기반으로 런타임에 0이 아닌 포인터 인스턴스를 생성할 수 있으므로 제네릭의 유연성과 다양성을 얻을 수 있습니다. 구체적인 구현 방법을 자세히 살펴보겠습니다.

질문 내용

이제 golang/go:master에서 유형 매개변수를 사용할 수 있으므로 시도해 보기로 했습니다. 유형 매개변수 제안에서 찾을 수 없는 한계에 부딪힌 것 같습니다. (아니면 제가 놓쳤나봐요).

인터페이스 유형 제약 조건을 사용하여 일반 유형 값 조각을 반환하는 함수를 작성하고 싶습니다. 전달된 유형이 포인터 수신기를 사용한 구현인 경우 이를 어떻게 인스턴스화합니까?

으아아아

*Count 类型作为 T 调用上述 SetGetterSlice() 函数时,此代码将在调用 Set(v) 时出现混乱。 (Go2go 游乐场)毫不奇怪,因为基本上代码创建了 nil 포인터 조각을 사용하는 경우:

으아아아

같은 질문의 변형

이 아이디어는 작동하지 않습니다. 가리키는 값을 인스턴스화하는 쉬운 방법을 찾을 수 없는 것 같습니다.

  1. out[i] = new(T) 将导致编译失败,因为它返回 *T,其中类型检查器希望查看 T.
  2. 전화*new(T) 进行编译,但会导致相同的运行时恐慌,因为 new(T) 返回 **Count 在这种情况下,其中指向 Count 的指针仍然是 nil.
  3. 반환 유형을 T에 대한 포인터 조각으로 변경하면 컴파일이 실패합니다.
으아아아

솔루션

지금까지 제가 찾은 유일한 해결책은 생성자를 일반 함수에 전달하도록 요구하는 것입니다. 그러나 그것은 잘못된 느낌이고 약간 지루한 느낌입니다. func F(T interface{})() []T가 완벽하게 유효한 구문이라면 왜 필요한가요?

으아아아

요약

내 질문(우선순위):

  1. 내가 명백한 것을 간과하고 있는 걸까요?
  2. 이것이 Go의 제네릭의 한계인가요? 이만큼 좋은가요?
  3. 이 제한 사항이 알려져 있습니까? 아니면 Go 프로젝트에서 문제를 제기해야 합니까?

해결 방법

기본적으로 T을 포인터 유형으로 변환할 수 있도록 하려면 제약 조건에 유형 매개변수를 추가해야 합니다. 가장 기본적인 형태의 기술은 다음과 같습니다(익명성 제한 포함):

으아아아

놀이터:https://www.php.cn/link/24aef8cb3281a2422a59b51659f1ad2e

단계별 솔루션

제약 사항 SetGetter 已经声明了类型参数 V이므로 위의 예를 약간 수정합니다.

으아아아

그런 다음 SetGetterSlice 函数,其类型参数为 T any,其目的只是实例化约束 SetGetter을 정의하세요.

그런 다음 식 &out[i]을 포인터 유형으로 캐스팅하고 포인터 수신기에서 메서드를 성공적으로 호출할 수 있습니다.

으아아아

전체 프로그램:

CFE57E536C89530D9A8C38E10967A10D

이제 SetGetterSlice에는 원래 VSetGetterSlice 现在需要三个类型参数:原始 V 加上 T (带有指针接收器的类型)和 PT (新约束)。然而,当您调用该函数时,您可以省略第三个 - 通过类型推断,实例化 PT SetGetter[V,T] 所需的类型参数 VT(포인터 수신기가 있는 유형) 및 PT( 새로운 제약). 그러나 함수를 호출할 때 세 번째 항목인 유형 추론을 통해 PT SetGetter[V,T]를 인스턴스화하는 데 필요한 유형 매개변수 V

를 생략할 수 있습니다. 알려진:

으아아아 놀이터:https://www.php.cn/link/6b061fc28f7473418a006dfa832708b1

🎜

위 내용은 일반 Go를 사용하여 유형 매개변수에 대한 0이 아닌 포인터를 인스턴스화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제