亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中使用 c 樣式迭代器的慣用方法

在 Go 中使用 c 樣式迭代器的慣用方法

Go
慕村9548890 2021-11-08 18:26:59
我是 Go 編程的新手(3-4 天),我正在嘗試編寫一些代碼,使用 cgo 使用現有的第三方 C 庫讀取二進制文件。C 庫執行此操作的方式似乎相當標準(對于 C)。稍微簡化一下,它看起來像: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 代碼: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        }    }}這是有效的,因為它將允許我訪問特定查詢區域中的記錄。我的問題是,這是否是在 Go 中處理此任務的慣用方法,還是有更好的選擇?我見過諸如http://ewencp.org/blog/golang-iterators 之類的網站,但似乎無法讓這些示例與 C 庫一起使用(我認為這可能是因為 C 庫正在重用 record_t 變量在每次迭代中,而不是創建一個新變量,但也許這只是我對 Go 缺乏經驗)。
查看完整描述

1 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

您所做的與在帶有 的文件中移動沒有什么不同io.Reader:


err, n := error(nil), 0

for err == nil {

    err, n = f.Read(in)

    // ...do stuff with in[:n]...

}

或使用(*bufio.Scanner).Scan()(參見文檔):


for scanner.Scan() {

    // ...do something with scanner.Text()...

}

if err := scanner.Err(); err != nil {

    log.Fatalln(err)

}

我認為您很少想要鏈接到的博客文章中更奇特的迭代器選項,那些帶有閉包或通道的選項。通道尤其會調用許多用于協調實際線程工作負載的機制,并且就約定而言,Go for 循環中的典型情況取決于它們正在迭代的內容而略有不同。(在這方面,它就像 C 中的迭代,但不同于(比如說)Python、C++ 或 Java。)


查看完整回答
反對 回復 2021-11-08
  • 1 回答
  • 0 關注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號