首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C风格迭代器与Go结合的惯用方法

C风格迭代器与Go结合的惯用方法
EN

Stack Overflow用户
提问于 2015-09-25 00:02:13
回答 1查看 202关注 0票数 0

我刚开始编程(3-4天),我正在尝试编写一些代码,使用现有的使用cgo的第三方C库读取二进制文件。C库的这种方式看起来相当标准(对于C)。稍微简化一下,看上去如下:

代码语言:javascript
复制
int main(int argc, char *argv[]) {
    file_t *file = file_open(filename);
    index_t *index = index_load(file, filename);
    iterator_t *iter = query(idx, header, region);
    record_t *record = record_init();

    while (iterator_next(file, iter, record) >= 0) {
        /* Do stuff with record */
    }

    iterator_destroy(iter);
    record_destroy(record);
    file_close(file);

    return 0;
}

我编写了以下Go代码:

代码语言:javascript
复制
func main() {
    file := Open(filename)
    record := NewRecord()
    iter := file.Query(region)
    for {
        n, err := file.Next(iter, record)
        if err != nil {
            log.Fatal(err)
        }
        if n <= 0 {
            // No more records to read.
            break
        }
    }
}

这是可行的,因为它允许我访问特定查询区域中的记录。

我的问题是,这是一种惯用的方式来完成这项任务,还是有更好的选择?我见过像http://ewencp.org/blog/golang-iterators这样的站点,但似乎无法让这些示例与C库一起工作(我认为这可能是因为C库在每次迭代时都重用record_t变量,而不是创建一个新变量,但可能是因为我对Go缺乏经验)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-27 20:12:59

您所做的与使用io.Reader移动文件没有什么不同

代码语言:javascript
复制
err, n := error(nil), 0
for err == nil {
    err, n = f.Read(in)
    // ...do stuff with in[:n]...
}

或者使用(*bufio.Scanner).Scan() (参见医生们):

代码语言:javascript
复制
for scanner.Scan() {
    // ...do something with scanner.Text()...
}
if err := scanner.Err(); err != nil {
    log.Fatalln(err)
}

我认为您很少希望在链接到的博客文章中提供更有异国情调的迭代器选项,比如那些带有闭包或通道的迭代器选项。特别是通道调用了许多用于协调实际线程工作负载的机器,在Go循环中,它只是典型的不同,这取决于它们迭代的内容。(在这方面,它类似于C中的迭代,但与(例如) Python、C++或Java不同。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32772798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档