为什么建议使用ctx作为第一个参数?

时间:2018-05-25 06:17:08

标签: http go backend

我是golang的新手。正如文件所说

  

不要将上下文存储在结构类型中;相反,将Context明确传递给需要它的每个函数。 Context应该是第一个参数,通常命名为ctx

但我发现,在典型的http请求句柄函数中,http.Request对象具有.Context()方法可以检索http请求所涉及的上下文。

那么为什么建议使用context作为这些函数的第一个参数。这种情况合理吗?

我知道这不是限制规则。但我不知道为什么HandlerFuncfunc(ResponseWriter, *Request)而不是func(context.Context, ResponseWriter, *Request)

显然,HandlerFunc打破了推荐。

1 个答案:

答案 0 :(得分:1)

正如您在上面引用的文档中所述,ctx应该是许多函数的(非常)公共参数。这与许多函数返回error的方式类似。公共参数/返回值的最佳位置是列表中的第一个或最后一个。 (可以说,Go本可以选择让error始终成为第一个返回值 - 我不会在这里讨论它。)

由于variadic个变量 只能 是函数参数列表中的最后一个,因此公共参数的唯一选项是第一个。

我希望这就是ctx永远是第一位的原因。

此模式通常也可以在Go(和其他语言)中与其他变量一起使用。每当公共变量被一组相关函数使用时,该公共变量通常首先出现在参数列表中(或者可能是第二个,在ctx之后)。

与您引用的建议相反,有些库将ctx存储在结构中,而不是将其作为第一个参数传递。这些通常(总是?)库必须经过改编才能使用ctx,在图书馆合同订立之后不久(通过Go 1.x兼容性保证)。

通常,您应该遵循建议,将ctx作为第一个参数传递给任何新作品。