ホームページ  >  記事  >  バックエンド開発  >  Go | スライスを追加して可変引数関数に送信する効率的で読みやすい方法

Go | スライスを追加して可変引数関数に送信する効率的で読みやすい方法

王林
王林転載
2024-02-05 21:30:11598ブラウズ

去 |附加切片并发送到可变参数函数的高效且可读的方法

質問の内容

次の機能パイプラインがあるとします。 リーリー

解決したい継承の問題により、

functions の関数は opts の関数より前に呼び出される必要があるため、単に opts に追加することはできません。 ただし、prepend functionsopts (append(functions, opts...) 経由) にしてから使用する必要があります。 # もう一度 ##... を実行するとパイプラインの次の関数に送信されるため、次のような奇妙な式が得られます。 リーリー どれほど効率的かはわかりませんが、奇妙に見えるのは確かです。

これを行うためのより良い方法があるはずです、それが私が探しているものです。

しかし、効率についての付随する説明はありがたいです :)

###編集: 既存のコード内にいるため、パラメーターの型を ​​p>opts ...functionobject

から

opts []functionobject

に変更できません (@dev.bmax がコメントで示唆しているように)ベースなので、func{ を呼び出す関数 1,2,3} を変更できません。 「奇妙に見える」とは、単に「見た目」を意味するのではなく、これを 2 回行う (省略記号) と奇妙に見え、非効率的に見えることを意味します (私が間違っているでしょうか?)

  1. 正解

スライスの前に追加することは、次の組み合わせが必要であるため、基本的に非効率です。

より大きなバッキング配列を割り当てます

項目をスライスの最後に移動

###...または両方。
  • 関数間の呼び出し規約を変更して、オプションを追加するだけで、それらを逆に処理できれば、より効率的になります。これにより、アイテムをスライスの末尾に繰り返し移動することがなくなり、最初の割り当て以外のすべての割り当てが回避されます (事前に十分なスペースが割り当てられている場合)。
  • リーリー
  • 注:
  • func3(opts ...functionobject) / func3(opts...)
  • および
func3(opts []functionobject) / func3(opts)

は、同等の性能。前者は、スライスを渡すための効果的な構文シュガーです。

ただし、呼び出し規約を保持する必要があるとおっしゃいました... サンプル コードでは、各関数内で 1 番目、2 番目、3 番目、5 番目...追加の割り当てが行われます。割り当ては、バッキング配列のサイズを 2 倍にするために必要です (小さなスライスの場合)。以前の追加で十分な予備容量が作成されなかった場合は、append(functions, opts...) が割り当てられることもあります。

補助関数を使用すると、コードが読みやすくなります。再利用も可能です

opts

アレイ内の予備容量をサポートします: リーリー 割り当てをより詳細に説明するヘルパー関数を使用しないいくつかの代替案:

リーリー

さらに一歩進んで、先頭に追加する項目を含むスライスを割り当てずに、opts の予備容量を再利用できます (関数ごとに 0 ~ 1 の割り当て)。ただし、これは複雑でエラーが発生しやすいため、お勧めしません。

以上がGo | スライスを追加して可変引数関数に送信する効率的で読みやすい方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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