ホームページ  >  記事  >  バックエンド開発  >  ジェネリックスを使用すると、「type *T は型パラメータへのポインタであり、型パラメータではありません」というエラーがスローされるのはなぜですか?

ジェネリックスを使用すると、「type *T は型パラメータへのポインタであり、型パラメータではありません」というエラーがスローされるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-04 16:46:02170ブラウズ

Why Does Go Throw the Error

ジェネリックを使用する: 型パラメーターと制約を理解する

この記事では、コンパイラ エラー「type *T は型ではなく型パラメーターへのポインターです」が発生する理由の複雑さを詳しく掘り下げています。

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

Go ジェネリックでは、型パラメータは、指定された制約を満たす任意の型のプレースホルダーを表します。特に、制約は型パラメーターで使用できる一連の操作を定義しますが、その型パラメーターから派生したポインター型のプロパティを直接定義するわけではありません。これは、発生したエラー メッセージの核心です。

エラー メッセージの説明

このエラー メッセージは、*T のメソッド セットには、対象となる具象型で宣言されたポインタ レシーバ メソッドが自動的に含まれないことを示します。拘束された。これは、制約インターフェイスにポインター レシーバー メソッドが必要な場合、具象型でポインター レシーバーを使用してそれを実装する必要があることを意味します。

問題の解決

提供されるコード スニペット内:

  1. 制約: 「SetId メソッドにポインター レシーバーがあります」エラーに対処するには、インターフェイス GS をポインター レシーバーで定義する必要があります:
<code class="go">type GS interface {
    Id() string
    (*GS) SetId(string)
}</code>
  1. インスタンス化: MyStore のインスタンス化では、A の代わりに *A を使用する必要があります:
<code class="go">var storeA = &MyStore[*A]{}</code>
  1. メソッドの変更: MyStore のメソッド定義を次のように変更します。 *T の代わりに T を使用します:
<code class="go">type MyStore[T GS] struct {
    values map[string]T
}

func (s *MyStore[T]) add(item T) {...}</code>

これらの調整を行うことで、コードは構文的にも意味的にも正しくなります。

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

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