我是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
?
答案 0 :(得分:2)
svc.Instances.Stop(project, zone, v.Name)
返回InstanceStopCall
通过调用Context(ctx)
,您可以设置要在此调用的Do方法中使用的上下文。如果上下文被取消,这将允许HTTP请求中止。
Stop方法可能花费很长时间(以分钟为单位)。这样,用户可以取消等待VM关闭的操作。