Home >Backend Development >Golang >Why Do I Get 'Type *T is Pointer to Type Parameter, Not Type Parameter' When Using Generics in Go?
When using generics in Go, it's crucial to distinguish between a type parameter and its constraint. A type parameter is denoted by a capital letter, such as T, while a constraint is an interface type that defines the behavior required by the type parameter. For instance:
<code class="go">type GS interface { Id() string SetId(string) }</code>
In this case, GS is the constraint, which specifies that a type implementing GS must have Id() and SetId() methods with specific signatures.
When using a type parameter like T in generics, it's essential to understand that *T is different from T. *T represents a pointer to the type parameter T.
In your example, the error encountered is:
type *T is pointer to type parameter, not type parameter
This error occurs when trying to use a pointer method (SetId() in this case) on the type parameter (T). However, pointer methods are only available on the pointer to the type parameter (*T) and not on the type parameter本身.
To resolve this issue, you need to explicitly specify the constraint on the pointer to the type parameter. This can be done by adding an additional constraint:
<code class="go">type GS interface { Id() string SetId(string) } type PT interface { *GS }</code>
Now you can use PT as the constraint on MyStore:
<code class="go">type MyStore[T PT] struct { values map[string]T }</code>
Changing the occurrences of *T to T in the MyStore struct and method definition will also be necessary.
The error message also indicates that the type A does not implement the GS interface because the SetId() method in A has a pointer receiver. To fix this, you need to ensure that the A type implements the GS interface correctly:
<code class="go">func (a *A) SetId(id string) { a.ID = id }</code>
With these modifications, the code should compile successfully.
The above is the detailed content of Why Do I Get 'Type *T is Pointer to Type Parameter, Not Type Parameter' When Using Generics in Go?. For more information, please follow other related articles on the PHP Chinese website!