ホームページ > バックエンド開発 > Golang > Golang: 「任意の」タイプのジェネリックのフィールドにアクセスする

Golang: 「任意の」タイプのジェネリックのフィールドにアクセスする

WBOY
リリース: 2024-02-10 10:39:07
転載
924 人が閲覧しました

Golang: 「任意の」タイプのジェネリックのフィールドにアクセスする

Golang は静的に型付けされたプログラミング言語であり、ジェネリックスの実装プロセスにおいて常に大きな注目を集めてきました。最近、Golang チームはジェネリックの設計において大きな進歩を遂げ、開発者が「任意の」型のジェネリックのフィールドにアクセスできるようになりました。この新機能は、Golang に優れた柔軟性とスケーラビリティをもたらします。次に、PHP エディター Xigua が、Golang の「任意の」型ジェネリックスのフィールドにアクセスする方法とアプリケーション シナリオを詳しく紹介します。

質問内容

ジェネリック型が any であるサードパーティ関数を使用しています。関数は渡された型のオブジェクトを返し、私自身のコードはその戻りに対して動作します。

HasID のジェネリックを受け入れ、それをサードパーティ関数に渡す独自のジェネリック関数を作成しようとしています。ただし、サードパーティ関数の戻り値の ID フィールドにアクセスしようとすると、エラーが発生します。

これを正しく入力するにはどうすればよいですか?

type HasID struct {
    ID string `json:"id"`
}

func ThirdPartyFunc[T any]() T {
  // do some stuff
  return someThing // of type T
}

func MyFunc[U HasID]() {
  thingWithID := ThirdPartyFunc[U]()
  fmt.Println(thingWithID.ID) // undefined (type U has no field or method ID)
}
ログイン後にコピー

回避策

@mkoprivaのコメントに同意しますが、制約のフィールドを定義できないため、それらのフィールドにアクセスできない可能性があると思います。型パラメータ。

(おそらく Go 1.19 では変更されていません、笑)

物事をシンプルにするために、通常と同じようにしてください:

リーリー

https://www.php.cn/link/bddcda5d65fcfdec9de3838794a77265

ただし、これをインターフェースとして定義すると、そのメソッドにアクセスできるようになります。

リーリー

https://www.php.cn/link/46dfb1fd21d4e16401260f54d2b6a88a

構造体を処理するには、型変換を行う必要があります。

リーリー

追記 - 2022 年 2 月から未解決の問題があります - https://github .com/golang/go/issues/51259

追伸 - ああ、今気づきました... - ジェネリックスを使用して構造体フィールドにアクセスする方法 (型 T にはフィールドやメソッドがありません)?

以上がGolang: 「任意の」タイプのジェネリックのフィールドにアクセスするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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