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

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

WBOY
WBOY転載
2024-02-10 10:39:07882ブラウズ

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 までご連絡ください。