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() メソッドに GS インターフェイスが実装されていないことも示しています。ポインタ受信機。これを修正するには、A 型が GS インターフェイスを正しく実装していることを確認する必要があります。
<code class="go">func (a *A) SetId(id string) { a.ID = id }</code>
これらの変更により、コードは正常にコンパイルされるはずです。
以上がGo でジェネリックスを使用すると、「Type *T は型パラメーターではなく、型パラメーターへのポインターです」というメッセージが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。