Go では、ジェネリックを使用する際の一般的なエラーは、試行時に「型 *T の変数を引数の型として使用できません」です。ジェネリック型へのポインターを関数に渡します。これは、ジェネリック型パラメーター T が、それを制限するために使用される制約型と同等ではないために発生します。
提供されたコードでは、インターフェイス FooBar は 2 つの和集合として定義されています。 foo 型と bar 型。これは、メソッド a() string を実装する任意の型を FooBar インターフェイスに割り当てることができることを意味します。ただし、関数 blah で使用されるジェネリック型パラメーター T は、暗黙的に FooBar と同等ではありません。
さらに、型 foo および bar のメソッドはポインター レシーバーに実装されます。 (foo と bar)。これは、メソッド a() 文字列が実際には型自体ではなく、これらの型へのポインターに対して定義されていることを意味します。
エラーを解決するには、次のいずれかをアサートする必要があります。ジェネリック型パラメーター T は、ストリンガー インターフェイスを実装するか、制約自体で型の共用体を明示的に定義します。
func blah[T FooBar]() { t := new(T) do(any(t).(stringer)) }
ただし、このアプローチでは型安全性が無視され、実行時パニックが発生する可能性があります。
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar[T]]() { var t T do(U(&t)) }
このアプローチでは型安全性が維持され、次のことが可能になります。ジェネリック型パラメータ T を非 nil に初期化する必要があります。 value.
Go でジェネリックを効果的に使用するには、ジェネリック型パラメーターとその制約の関係を理解することが重要です。インターフェイスと制約を慎重に定義することで、型安全性を強化し、実行時エラーを回避できます。
以上がGo の汎用コードが「*T 型の変数を引数の型として使用できません」というエラーで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。