登录
首页 >  Golang >  Go问答

golang Context 的正确风格和用法是什么?

来源:stackoverflow

时间:2024-04-15 13:33:34 218浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《golang Context 的正确风格和用法是什么?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

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

在下面的代码片段中,在我看来,我已经使用上下文实例化了我的 computeservice 。为什么在调用 stop() 时必须再次将其传递给 .context() 函数?

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


解决方案


svc.Instances.Stop(项目、区域、v.Name) 返回 InstanceStopCall

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

Stop 方法可能需要很长时间(以分钟为单位)。这允许用户取消等待虚拟机关闭。

今天关于《golang Context 的正确风格和用法是什么?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>