さまざまなランタイム型を持つ Go 汎用コンテナー
Go では、あらゆる型のデータを処理できる汎用コンテナーを作成できるため、コードの柔軟性が向上します。 。ただし、チャネルにはあらゆるタイプのデータが含まれる可能性があるため、ゴルーチンの開始時にチャネルのタイプを指定するのは困難な場合があります。
初期アプローチ:
最初に、 Go 1.18 で新たに導入されたジェネリックを次のように活用するために作成されました。コード:
func StartController[T any](sender chan Packet[T]) { go runThread(sender) } func runThread[T any](sender chan Packet[T]) { fmt.Println("in thread") for true { data := <-sender fmt.Println(data) } }
ただし、このアプローチでは、ジェネリック型 Packet[T インターフェイス{}] のインスタンス化に失敗するため、コンパイル エラーが発生しました。
ジェネリックの正しい使用法:
ジェネリックを使用する前提として、パラメーター化された型は使用前に具象型パラメーターを使用してインスタンス化する必要があります。たとえば、ジェネリック型 GenericChan[T any] chan T には、具体型を使用した明示的なインスタンス化が必要です:
c := make(GenericChan[int])
代替解決策:
ジェネリックを使用する代わりに、別の解決策は、任意のインターフェースを表すことができるインターフェース{} タイプを使用することです。 type:
c := make(chan interface{}) func StartController(sender chan interface{}) { go runThread(sender) } func runThread(sender chan interface{}) { fmt.Println("in thread") for true { data := <-sender fmt.Println(data) } }
このアプローチにより、チャネルはあらゆるタイプのデータを受信できるようになります。ただし、データ処理中に実際の型を決定するために型アサーションが必要になります。
interface{} を使用するデメリット:
interface{} を使用すると柔軟性が得られますが、また、潜在的な欠点も導入されます:
結論:
ジェネリック医薬品には利点がありますが、それは不可欠です正しい使用法と制限事項を理解するために。あらゆる型を処理できるチャネルの場合、型の安全性とコードの複雑さの点で多少のトレードオフはありますが、interface{} の使用は依然として実行可能なソリューションです。
以上がコンパイル エラーを発生させずに、さまざまなランタイム タイプ用の Go 汎用コンテナーを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。