Golang Context的正确样式和用法是什么?

时间:2019-06-26 06:54:22

标签: go google-cloud-platform

我是golang的新手,并试图更好地了解上下文。

在下面的代码片段中,我似乎已经用上下文实例化了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 个答案:

答案 0 :(得分:2)

svc.Instances.Stop(project, zone, v.Name)返回InstanceStopCall

通过调用Context(ctx),您可以设置要在此调用的Do方法中使用的上下文。如果上下文被取消,这将允许HTTP请求中止。

Stop方法可能花费很长时间(以分钟为单位)。这样,用户可以取消等待VM关闭的操作。