ホームページ >バックエンド開発 >Golang >チャネルとスライスを受け入れる汎用関数

チャネルとスライスを受け入れる汎用関数

PHPz
PHPz転載
2024-02-06 08:36:10810ブラウズ

チャネルとスライスを受け入れる汎用関数

質問内容

同様の方法でスライスとチャネルの値を検索する汎用関数を golang で作成しようとしています。以下に例を示します:

リーリー

しかし、次のコンパイル エラーが発生します: cannot range over input (Variable of type t is binding by chan int|[]int) (t has no core type)

次のような汎用インターフェイスを作成しようとします:

リーリー

ただし、エラーは cannot range over input (varable of type t subject to rangeable) (t has no core type) に変更されました 基本的には同じままです...

ジェネリックまたはチャネルを使用してこのタスクを解決する方法はありますか?スライスを同じコア タイプに「変換」することはできません。

ご提案やアイデアをありがとうございます!


正解


それはできません。

range 式は コア タイプで始まる必要があります。異なる型の項を持つ共用体には、共通の基礎となる型がないため、コア型がありません。

また、

range にコア タイプが必要な理由も直感的にわかります。スライス範囲とチャネル範囲のセマンティクスが異なります。

  1. チャネル上のレンジングはブロック操作になる可能性がありますが、スライス上のレンジングはブロッキング操作ではありません

  2. 反復変数が異なります

  3. リーリー
スライスの場合、

iint 型のインデックスであり、item はスライス要素の型です。 リーリー

チャネルの場合、

item は chan 要素のタイプであり、これが唯一の可能なスコープ変数です。

あなたができる最善のものはタイプスイッチです:

リーリー

しかし、繰り返しになりますが、この関数の動作 (ブロッキングか非ブロッキングか) は型によって異なり、ここでジェネリックを使用することでどのような利点が得られるかは明らかではありません。

以上がチャネルとスライスを受け入れる汎用関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。