ホームページ > バックエンド開発 > Golang > Go Generics の「型 *T の変数を型ストリンガーとして使用できません」エラーを解決するにはどうすればよいですか?

Go Generics の「型 *T の変数を型ストリンガーとして使用できません」エラーを解決するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-20 15:22:10
オリジナル
837 人が閲覧しました

How Can I Resolve the

ジェネリックにおける型の安全性に関する考慮事項

Go のジェネリックでは、型パラメータ T は制約インターフェイス FooBar とは異なります。ただし、この区別により疑問が生じます。ストリンガー (do など) を実装する型を期待する関数に T のインスタンスを渡すにはどうすればよいですか?

エラーについて

「実行する引数の型ストリンガーとして型 *T の変数を使用できません」というエラー メッセージは、何とかのパラメータ t が、実装する型として誤認されていることを示唆しています。ストリンガー。ただし、T は本質的にこのメソッドを持っていません。

問題の解決

t を stringer に変換できるようにするには、次の手順が必要です:

  1. FooBar にストリンガー インターフェイスを導入します: FooBar にストリンガーを追加します制約を使用して、FooBar を満たすすべての型がストリンガー メソッドを持つことができるようにします。
  2. 共用体の型を変更します: FooBar 制約を変更して、foo または bar へのポインタを受信側の型として受け入れます。 stringer はポインターです。
  3. 複合リテラルをポインターとして宣言します: できないためコア型のない制約で複合リテラルを宣言するには、 t をポインター型として宣言する必要があります。
  4. FooBar の型パラメーターを導入します: FooBar から型共用体を新しい型パラメーターに抽出します。 U と T に互換性のある型セットがあることを確認します。

Finalコード

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar]() {
    var t T
    do(U(&t))
}

func main() {
    blah[foo]()
}
ログイン後にコピー

説明

さて、何とかを呼び出すと、型 T の変数 t がポインタとして宣言されます。 FooBar[T] は、U を T へのポインターを含む型に制約します。&t から U への変換は有効で、FooBar[T] のメソッド (ストリンガーを含む) は受信側 t.

注:

FooBar の型パラメータを使用すると、引数を渡すことが可能になり、中間パラメータが不要になります策略。たとえば、blah を次のように変更できます:

func blah[T FooBar](t T) {
    do(t)
}
ログイン後にコピー
そして、blah(&foo{}) で呼び出します。

以上がGo Generics の「型 *T の変数を型ストリンガーとして使用できません」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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