Home >Backend Development >Golang >Why Do I Get 'Type *T is Pointer to Type Parameter, Not Type Parameter' When Using Generics in Go?

Why Do I Get 'Type *T is Pointer to Type Parameter, Not Type Parameter' When Using Generics in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-05 12:53:02759browse

Why Do I Get

Go with Generics: Type *T is Pointer to Type Parameter, Not Type Parameter

Understanding Type Parameters and Constraints

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.

Type *T vs. Type Parameter

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.

Error Explanation

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本身.

Solving the Issue

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.

Implementation of the Constraint

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn