猿问

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

我的阅读清单中有一些文章。每篇文章都有属性“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 循环不可预测。


实现这一目标的有效且漂亮的方法是什么?


白衣染霜花
浏览 223回答 2
2回答

MYYA

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 所说,如果你的文章结构很大,那可能是一件好事。
随时随地看视频慕课网APP

相关分类

Go
我要回答