Каков правильный стиль и использование Golang Context? - PullRequest
0 голосов
/ 26 июня 2019

Я новичок в Голанге и пытаюсь лучше понять контекст.

В приведенном ниже фрагменте мне кажется, что я создал экземпляр моего computeService с контекстом. почему я должен передать его снова функции .Context() при вызове Stop()?

package main

func stopTaggedMachines(ctx context.Context, svc *compute.Service, project, zone, tag string) ([]string, error) {
    var instances []string
    f := func(page *compute.InstanceList) error {
        for _, v := range page.Items {
            if v.Labels["gcp-idler-managed"] == "true" {
                result, err := svc.Instances.Stop(project, zone, v.Name).Context(ctx).Do()
                if err != nil {
                    log.Fatal(err)
                }
                fmt.Printf("[INFO] gcp-machine-idler: Instance in state %v, Stopping %v... Response: %v \n", v.Status, v.Name, result.HTTPStatusCode)
            }
        }
        return nil
    }

    call := svc.Instances.List("my-project", "us-west1-b")
    if err := call.Pages(oauth2.NoContext, f); err != nil {
        return instances, nil
    }
    return instances, nil
}

func main() {
    // Use oauth2.NoContext if there isn't a good context to pass in.
    ctx := context.Background()

    computeService, err := compute.NewService(ctx)
    if err != nil {
        log.Fatal(err)
    }
    stopTaggedMachines(ctx, computeService, "my-project", "us-west1-b", "gcp-idler-managed")
    return
}

Мне кажется избыточным, что я передаю ctx в compute.NewService(), а затем снова в stopTaggedMachines()

Это действительно правильное соглашение или использование контекста? Почему мой вызов svc.Instances.Stop(project, zone, v.Name).Context(ctx).Do() должен быть передан ctx еще раз в качестве параметра?

1 Ответ

2 голосов
/ 26 июня 2019

svc.Instances.Stop(project, zone, v.Name) возвращает InstanceStopCall

Вызывая Context(ctx), вы устанавливаете контекст, который будет использоваться в методе Do этого вызова.Это позволяет прервать HTTP-запрос в случае отмены контекста.

Метод Stop может занять много времени (как в минутах).Это позволяет пользователю отменить ожидание завершения работы виртуальной машины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...