为了账号安全,请及时绑定邮箱和手机立即绑定

如何在for循环中修改切片?

如何在for循环中修改切片?

Go
白衣染霜花 2021-06-05 14:10:09
我的阅读清单中有一些文章。每篇文章都有属性“FeedURL”,该属性包含文章来源的提要的 URL。当我取消订阅某个提要时,我希望能够删除包含该提要 URL 的每篇文章。type Article struct {    FeedURL string    URL     string // should be unique    // ... more data}func unsubscribe(articleList []Article, url string) []Article {   // how do I remove every Article from articleList that contains url?}func main() {    myArticleList := []Article{        Article{"http://blog.golang.org/feed.atom", "http://blog.golang.org/race-detector"},        Article{"http://planet.python.org/rss20.xml", "http://archlinux.me/dusty/2013/06/29/creating-an-application-in-kivy-part-3/"},        Article{"http://planet.python.org/rss20.xml", "http://feedproxy.google.com/~r/cubicweborg/~3/BncbP-ap0n0/2957378"},        // ... much more examples    }    myArticleList = unsubscribe(myArticleList, "http://planet.python.org/rss20.xml")    fmt.Printf("%+v", myArticleList)}解决这个问题的有效方法是什么?起初,我的取消订阅代码如下所示:func unsubscribe(articleList []Article, url string) []Article {    for _, article := range articleList {        if article.FeedURL == url {            articleList = append(articleList[:i], articleList[i+1:]...)        }    }    return articleList}但后来我意识到这会改变切片并使 for 循环不可预测。实现这一目标的有效且漂亮的方法是什么?
查看完整描述

2 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

PeterSO 的回答是高效完成工作。


但是,我可能会采用这样的简单方法


func unsubscribe(articleList []Article, url string) (filtered []Article) {

    filtered = articleList[:0] // optional.  reuses already-allocated memory.

    for _, article := range articleList {

        if article.FeedURL != url {

            filtered = append(filtered, article)

        }

    }

    return

}

阅读和理解只需大约两秒钟。


这个想法也适用于指向文章的指针,就像 PeterSO 所说,如果你的文章结构很大,那可能是一件好事。


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信