gpt4 book ai didi

go - 如何从 slice 中删除项目的重复项?

转载 作者:IT王子 更新时间:2023-10-29 01:20:16 25 4
gpt4 key购买 nike

我正在编写一个命令行工具,用于从文本文件中删除对等节点。

这是文本文件。它在代码中的引用是 cfg.Bootstrap

 "Bootstrap": [
{
"Address": "/ip4/162.243.139.64/tcp/5001",
"PeerID": "QmXZPT1SLcczjNSLnSCsQBWwbosKjrDRo122Ys8ajKoQXQ"
},
{
"Address": "/ip4/162.243.139.64/tcp/5001",
"PeerID": "QmXZPT1SLcczjNSLnSCsQBWwbosKjrDRo122Ys8ajKoQXA"
},
{
"Address": "/ip4/162.243.139.64/tcp/5001",
"PeerID": "QmXZPT1SLcczjNSLnSCsQBWwbosKjrDRo122Ys8ajKoQXQ"
},
{
"Address": "/ip4/162.243.139.64/tcp/5001",
"PeerID": "QmXZPT1SLcczjNSLnSCsQBWwbosKjrDRo122Ys8ajKoQXA"
}

]

对等对象是使用用户提供的 PeerID 和地址创建的。看起来像这样

peer := config.BootstrapPeer{
Address: address,
PeerID: pID,
}

目标是删除所有包含用户提供的地址和 PeerID 的节点 cfg.Bootstrap

   //iterate through the list of peers multiple times so that we delete all matches
for i := range cfg.Bootstrap {

//iterate through the list of peers
for i, val := range cfg.Bootstrap {

//if the user supplied PeerID and Address match a Peer object in cfg.Bootstrap..
if(val.PeerID == peer.PeerID && val.Address == peer.Address) {

//remove that element
cfg.Bootstrap = append(cfg.Bootstrap[:i], cfg.Bootstrap[i+1:]...)
}

}

fmt.Println(i)

}

除非 cfg.Bootstrap 中的最后一个对等节点有副本,否则此方法有效。如果它有重复项,则 Go 会出现

panic
panic: runtime error: slice bounds out of range

我需要这样做,以便用户可以删除包括最后一个对等点在内的对等点的所有副本。有什么想法吗?

最佳答案

基本思想是复制值 != 以对等到 slice 的开头并在完成后修剪多余部分。

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]

关于go - 如何从 slice 中删除项目的重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26172673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com