「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go のスライスから重複ピアを効率的に削除するにはどうすればよいですか?

Go のスライスから重複ピアを効率的に削除するにはどうすればよいですか?

2024 年 11 月 17 日に公開
ブラウズ:136

How to Efficiently Remove Duplicate Peers from a Slice in Go?

スライスから重複項目を削除

「アドレス」と「ピアID」を持つオブジェクトとして表されるピアのリストを含むテキスト ファイルが与えられたとします。属性の場合、タスクは、コードの「ブートストラップ」スライスから一致する「アドレス」と「ピアID」に基づいて重複するピアをすべて削除することです。 configuration.

これを実現するには、スライス内の各ピア オブジェクトを複数回繰り返します。各反復中に、その「PeerID」および「Address」をユーザーが指定した値と比較します。一致するものが見つかった場合は、その特定のオブジェクトをスライスから削除します。このプロセスにより、ピアのすべてのインスタンスが確実に削除されます。

ただし、考慮すべき特殊なケースがあります。 「ブートストラップ」スライス内の最後のピアが重複している場合、コードは「スライスの境界が範囲外です」エラーでパニックになります。この問題に対処するには、一致しない値をスライスの先頭にコピーし、反復が完了したときに余分な値をトリミングする、より堅牢なソリューションを実装できます。

更新されたコードは次のとおりです。

i := 0
for _, v := range cfg.Bootstrap {
   if v.PeerId == peer.PeerId && v.Address == peer.Address {
      continue
   }
   cfg.Bootstrap[i] = v
   i  
}
cfg.Bootstrap = cfg.Bootstrap[:i]

このコードは、「Bootstrap」スライスを反復処理します。各ピア オブジェクトについて、その「PeerID」および「アドレス」をユーザーが指定した値と比較します。ピアが重複していない場合は、インデックス「i」のスライスの先頭にコピーされます。次に、「i」インデックスがインクリメントされて、次に使用可能な位置を指すようになります。

反復が完了すると、「ブートストラップ」スライスがトリムされて余分な要素が削除され、最後のピアを含むすべての重複ピアが効果的に削除されます。 .

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3