次の機能パイプラインがあるとします。 リーリー
解決したい継承の問題により、functions の関数は
opts の関数より前に呼び出される必要があるため、単に
opts に追加することはできません。 ただし、
prepend functions を
opts (
append(functions, opts...) 経由) にしてから使用する必要があります。 # もう一度 ##...
を実行するとパイプラインの次の関数に送信されるため、次のような奇妙な式が得られます。
リーリー
どれほど効率的かはわかりませんが、奇妙に見えるのは確かです。
しかし、効率についての付随する説明はありがたいです :)
###編集: 既存のコード内にいるため、パラメーターの型を p>opts ...functionobject
から
opts []functionobject に変更できません (@dev.bmax がコメントで示唆しているように)ベースなので、func{ を呼び出す関数 1,2,3}
を変更できません。
「奇妙に見える」とは、単に「見た目」を意味するのではなく、これを 2 回行う (省略記号) と奇妙に見え、非効率的に見えることを意味します (私が間違っているでしょうか?)
項目をスライスの最後に移動
###...または両方。は、同等の性能。前者は、スライスを渡すための効果的な構文シュガーです。
ただし、呼び出し規約を保持する必要があるとおっしゃいました...
サンプル コードでは、各関数内で 1 番目、2 番目、3 番目、5 番目...追加の割り当てが行われます。割り当ては、バッキング配列のサイズを 2 倍にするために必要です (小さなスライスの場合)。以前の追加で十分な予備容量が作成されなかった場合は、append(functions, opts...)
が割り当てられることもあります。
補助関数を使用すると、コードが読みやすくなります。再利用も可能です
opts アレイ内の予備容量をサポートします:
リーリー
割り当てをより詳細に説明するヘルパー関数を使用しないいくつかの代替案:
さらに一歩進んで、先頭に追加する項目を含むスライスを割り当てずに、opts
の予備容量を再利用できます (関数ごとに 0 ~ 1 の割り当て)。ただし、これは複雑でエラーが発生しやすいため、お勧めしません。
以上がGo | スライスを追加して可変引数関数に送信する効率的で読みやすい方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。