5

正如文件所说

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

但我发现,在典型的 http 请求句柄函数中,一个http.Request对象的.Context()方法可以检索与 http 请求关联的上下文。

那么为什么建议在这些函数中使用上下文作为第一个参数。在这种情况下这样做合理吗?


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

显然,HandlerFunc打破建议。

4

1 回答 1

5

如您在上面引用的文档中所述,ctx应该是许多函数的(非常)通用参数。这类似于许多函数返回error. 公共参数/返回值的最佳位置是列表中的第一个或最后一个。(可以说,Go 可以选择让error总是作为第一个返回值——我不会在这里讨论)。

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

我希望这就是为什么ctx总是第一。

这种模式也经常出现在 Go(和其他语言)中的其他变量中。每当一组相关函数使用公共变量时,该公共变量通常位于参数列表中的第一位(或者可能位于第二位,在 之后ctx)。


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

ctx通常,对于任何新工作,您都应该遵循作为第一个参数传递的建议。

于 2018-05-25T07:10:03.413 回答