ホームページ >バックエンド開発 >Golang >Go でジェネリックスを使用すると、「Type *T は型パラメーターではなく、型パラメーターへのポインターです」というメッセージが表示されるのはなぜですか?

Go でジェネリックスを使用すると、「Type *T は型パラメーターではなく、型パラメーターへのポインターです」というメッセージが表示されるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 12:53:02768ブラウズ

Why Do I Get

ジェネリックを使用する: Type *T は型パラメータではなく型パラメータへのポインタです

型パラメータと制約について

Go でジェネリックを使用する場合、型パラメータとその制約を区別することが重要です。型パラメーターは T などの大文字で表されますが、制約は型パラメーターに必要な動作を定義するインターフェイス型です。例:

<code class="go">type GS interface {
    Id() string
    SetId(string)
}</code>

この場合、GS は制約であり、GS を実装する型には特定のシグネチャを持つ Id() メソッドと SetId() メソッドが必要であることを指定します。

Type * T と型パラメーター

ジェネリックで 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() メソッドに GS インターフェイスが実装されていないことも示しています。ポインタ受信機。これを修正するには、A 型が GS インターフェイスを正しく実装していることを確認する必要があります。

<code class="go">func (a *A) SetId(id string) { a.ID = id }</code>

これらの変更により、コードは正常にコンパイルされるはずです。

以上がGo でジェネリックスを使用すると、「Type *T は型パラメーターではなく、型パラメーターへのポインターです」というメッセージが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。