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

Http 为什么建议使用ctx作为第一个参数?,http,go,backend,Http,Go,Backend,我是刚来戈朗的。正如文件所说 不要在结构类型中存储上下文;相反,将上下文显式地传递给每个需要它的函数。上下文应该是第一个参数,通常命名为ctx 但是我发现,在典型的http请求句柄函数中,http.request对象具有.Context()方法可以检索http请求关联的上下文 那么,为什么建议在这些函数中使用上下文作为第一个参数呢。在这种情况下这合理吗 我知道这不是一个限制规则。但是我不知道为什么HandlerFunc是func(ResponseWriter,*Request)而不是func(

我是刚来戈朗的。正如文件所说

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

但是我发现,在典型的http请求句柄函数中,
http.request
对象具有
.Context()
方法可以检索http请求关联的上下文

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


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


显然,
HandlerFunc
违反了建议。

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

由于变量可能只是函数参数列表中的最后一个,因此只有公共参数可以作为第一个参数

我想这就是为什么
ctx
总是第一位的原因

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


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


一般来说,对于任何新工作,您都应该遵循建议,将
ctx
作为第一个参数通过。

该建议很好,请坚持。请注意,对于http包,需要在不破坏兼容性的情况下改装上下文帽。这里没什么可看的,这是个惯例。就像节点中的“错误第一次回调”。@Volker那么你是说添加
.Context()
只是为了不破坏兼容性?这不是最佳实践?是的,这是最佳实践。违反保证兼容性的承诺将是一种糟糕的做法。谢谢,作为一个新手,
http
包中的差异真的让我感到困惑