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

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

PHPz
リリース: 2024-02-06 08:36:10
転載
818 人が閲覧しました

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

質問内容

同様の方法でスライスとチャネルの値を検索する汎用関数を 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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート