ホームページ > バックエンド開発 > Golang > Go でジェネリック型ポインターを特定のインターフェイスに安全に変換するにはどうすればよいですか?

Go でジェネリック型ポインターを特定のインターフェイスに安全に変換するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-11 16:57:22
オリジナル
560 人が閲覧しました

How to Safely Convert a Generic Type Pointer to a Specific Interface in Go?

ジェネリック型パラメーターを特定の型に変換できません

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))
}
ログイン後にコピー

説明:

  • T の制約は foo または bar になり、FooBar は T でパラメータ化されます。
  • 特定の型へのポインタを作成できます。 (例: *foo) そしてそれを blah に渡します。これにより、対応する型で FooBar がインスタンス化されます。
  • U と T へのポインターには同じ型が設定されているため、変換 U(&t) が有効になります。

このソリューションにより、ストリンガー インターフェイスを実装する特定の型のインスタンスを渡すことができ、インスタンス化中の型の安全性が確保されます。

以上がGo でジェネリック型ポインターを特定のインターフェイスに安全に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート