в документах golang bigquery указан оператор done, но он генерирует ошибку компиляции

# #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