我是 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。)
- 1 回答
- 0 關注
- 198 瀏覽
添加回答
舉報
0/150
提交
取消