C++ 风格的 Golang 迭代器

标签 go iterator

我已经开始学习 Go,并且我了解 C++ 语言。 可以在 C++ 中以相同的方式处理 slice 或列表吗?例如,在 C++ 中,我们可以使用迭代器来指向集合中的位置,如上所示:

#include <list>

int main() {
    std::list<int> list = {1,1,2,3,1,4,5,6,7,8,1,1,9,10};
    auto it = std::find(list.begin(), list.end(), 3);
    // Now I can use the 'it' for insert items, remove/transform diaposonces etc.
   ++it;
   list.erase(it, std::remove(it, list.end(), 1);
}

并按照我们的意愿向前/向后迭代。对于这样的任务,什么是好的做法?在 Golang 中使用迭代器的最有效方式是什么?

最佳答案

Go 和 C++ 是非常不同的语言。不要尝试在 Go 中使用 C++ STL 风格。其他 Go 程序员不会看到您正在尝试做什么。

我使用过的几乎所有 Go 代码都使用数组/slice 索引而不是迭代器。在链表有意义的奇怪情况下,您只持有头指针、尾指针。

尝试编写 STL 风格的代码需要 Go 没有的模板。尝试在 Go 中编写“通用”代码会导致接口(interface){}和反射的可怕灾难,这些代码读起来很难看,性能比应有的差 5 倍。

只需在 Go 中编写 Go 风格的代码。

关于C++ 风格的 Golang 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48601016/

相关文章:

google-app-engine - 使用 Golang 和 Standard Env 在 Google App Engine 上使用 urlfetch 添加 header 的正确方法

go - 禁止在 golang 内联

Java - 如何迭代对象数组列表并将满足特定条件的元素添加到另一个对象数组列表

loops - Rust 如何知道何时停止迭代没有上限的范围?

python - Python中有序子集的高效枚举

c++ - 迭代器两个**的含义

go - 为 3rdparty/go/golang.org/x/text :* 定义 go_remote_library 声明时出现问题

go - 如何在特定文件夹中运行 shell 命令

Go 变量初始化语法

css - 在 Sass 中动态生成类名和 CSS 属性