doubo1711 2014-10-03 02:58
浏览 9
已采纳

如何从切片中删除项目的重复项?

I'm writing a command line tool that will delete peers from a text file.

This is the text file. Its reference in code is 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"
}

]

The peer object is created using a user supplied PeerID and Address. It looks like this

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

The goal is to remove all peers cfg.Bootstrap that contain the user supplied Address and PeerID

   //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)

    }

This works UNLESS the last peer in cfg.Bootstrap has a duplicate. If it has a duplicate then Go panics with

panic: runtime error: slice bounds out of range

I need to make it so the user can delete all copies of a peer that include the last peer. Any ideas?

  • 写回答

1条回答 默认 最新

  • dongpian2559 2014-10-03 03:16
    关注

    The basic idea is to copy values != to peer to the beginning of the slice and trim the excess when done.

    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]
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 求解vmware的网络模式问题
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?