ジェネリック型パラメーターを特定の型に変換できません
Go でジェネリックスを使用する場合、ジェネリック型パラメーターとジェネリック型パラメーターの関係を理解することが重要です。彼らの制約。この場合、問題は、特定のインターフェイス (ストリンガー) を予期する関数に引数としてジェネリック型パラメーター (*T) へのポインターを渡そうとしたことが原因です。
エラー メッセージでは、*T が説明されています。型パラメータへのポインタですが、ストリンガー インターフェイスは実装されていません。これは、T (FooBar) の制約とストリンガー インターフェイスが本質的に接続されていないためです。これを解決するには、この 2 つの間の関係を確立する必要があります。
解決策 1: タイプ セーフティ (安全でない) のアサート
1 つの解決策は、*T が次であることをアサートすることです。 any() を使用するストリンガー。これにより、ポインタを引数として渡すことができますが、タイプ セーフが犠牲になり、実行時パニックが発生する可能性があります。
func blah[T FooBar]() { t := new(T) do(any(t).(stringer)) }
解決策 2: FooBar のパラメータ化 (タイプ セーフ)
もう 1 つの解決策は、FooBar インターフェイスをジェネリック型 T でパラメータ化し、FooBar の型パラメータとユーザーの型パラメータが確実に一致するようにすることです。なんとか試合にパス。このアプローチでは型の安全性が維持され、ストリンガー インターフェイスを実装する特定の型にポインタを渡すことができます。
type FooBar[T foo | bar] interface { *T stringer } func blah[T foo | bar, U FooBar[T]]() { var t T do(U(&t)) }
説明:
このソリューションにより、ストリンガー インターフェイスを実装する特定の型のインスタンスを渡すことができ、インスタンス化中の型の安全性が確保されます。
以上がGo でジェネリック型ポインターを特定のインターフェイスに安全に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。