Go에서 제네릭을 사용할 때 , 유형 매개변수와 해당 제약조건을 구별하는 것이 중요합니다. 유형 매개변수는 T와 같은 대문자로 표시되는 반면, 제약조건은 유형 매개변수에 필요한 동작을 정의하는 인터페이스 유형입니다. 예를 들면 다음과 같습니다.
<code class="go">type GS interface { Id() string SetId(string) }</code>
이 경우 GS는 GS를 구현하는 유형에 특정 서명이 있는 Id() 및 SetId() 메서드가 있어야 함을 지정하는 제약 조건입니다.
제네릭에서 T와 같은 유형 매개변수를 사용할 때 *T가 T와 다르다는 점을 이해하는 것이 중요합니다. *T는 유형 매개변수 T에 대한 포인터를 나타냅니다.
귀하의 예에서 발생한 오류는 다음과 같습니다.
type *T is pointer to type parameter, not type parameter
이 오류는 유형 매개변수(T)에서 포인터 메소드(이 경우 SetId())를 사용하려고 할 때 발생합니다. ). 그러나 포인터 메서드는 유형 매개변수(*T)에 대한 포인터에서만 사용할 수 있으며 유형 매개변수本身에서는 사용할 수 없습니다.
이 문제를 해결하려면 명시적으로 다음을 수행해야 합니다. 유형 매개변수에 대한 포인터에 대한 제약조건을 지정합니다. 이는 추가 제약 조건을 추가하여 수행할 수 있습니다.
<code class="go">type GS interface { Id() string SetId(string) } type PT interface { *GS }</code>
이제 MyStore에서 PT를 제약 조건으로 사용할 수 있습니다.
<code class="go">type MyStore[T PT] struct { values map[string]T }</code>
MyStore에서 *T의 발생을 T로 변경 구조체 및 메서드 정의도 필요합니다.
오류 메시지는 또한 A의 SetId() 메서드에 포인터 수신기. 이 문제를 해결하려면 A 유형이 GS 인터페이스를 올바르게 구현하는지 확인해야 합니다.
<code class="go">func (a *A) SetId(id string) { a.ID = id }</code>
이러한 수정을 통해 코드가 성공적으로 컴파일되어야 합니다.
위 내용은 Go에서 제네릭을 사용할 때 '유형 *T는 유형 매개변수가 아닌 유형 매개변수에 대한 포인터입니다'라는 메시지가 나타나는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!