# #go #google-bigquery
# #Вперед #google-bigquery
Вопрос:
Итак, в документах здесь указано, что конкретно использовать iterator.Done
:
Next loads the next row into dst. Its return value is iterator.Done if there are no more results. Once Next returns iterator.Done, all subsequent calls will return iterator.Done.
Однако, если я попытаюсь использовать Done, это приведет к ошибке компилятора. Действительно, Done не определено в документах RowIterator здесь.
Мой код (почти идентичный документам):
it, err := job.Read(ctx)
if err != nil {
fmt.Println(err)
}
for {
var rec MyType
err := it.Next(amp;rec)
// the docs say to use Done, but it provides an error
if err == it.Done {
break
}
if err != nil {
fmt.Println(err)
}
rows = append(rows, rec)
}
Когда я пытаюсь его собрать, я получаю:
./test.go:94:15: it.Done undefined (type *"cloud.google.com/go/bigquery".RowIterator has no field or method Done)
Чего мне не хватает?
Ответ №1:
iterator.Done
это переменная, определенная в пакете итератора. Поэтому замените it.Done
на iterator.Done
. Это показано в этом примере:
package main
import (
"cloud.google.com/go/bigquery"
"context"
"fmt"
"google.golang.org/api/iterator"
)
func main() {
ctx := context.Background()
client, err := bigquery.NewClient(ctx, "project-id")
if err != nil {
// TODO: Handle error.
}
q := client.Query("select name, num from t1")
it, err := q.Read(ctx)
if err != nil {
// TODO: Handle error.
}
for {
var row []bigquery.Value
err := it.Next(amp;row)
if err == iterator.Done {
break
}
if err != nil {
// TODO: Handle error.
}
fmt.Println(row)
}
}
Комментарии:
1. @Omortis: Это понятно — смотрите прототипы — pkg.go.dev/cloud.google.com/go/bigquery#Job.Read и pkg.go.dev/google.golang.org/api/iterator
Ответ №2:
Вы перепутали итератор, возвращаемый из Job.Read
вызова, т.е. RowIterator
и общий API Google iterator
в https://pkg.go.dev/google.golang.org/api/iterator
Вы должны проверить возвращаемое значение из последнего, т.Е. err == iterator.Done
Проверить, завершена ли итерация. Примеры кодов в документации содержат полезные примеры — https://github.com/GoogleCloudPlatform/golang-samples/tree/master/bigquery