我是golang的新手。正如文档所说
不要将上下文存储在结构类型中;而是将上下文明确传递给需要它的每个函数。Context应该是第一个参数,通常命名为ctx
但是我发现,在典型的http请求句柄函数中,http.Request
对象具有.Context()
方法可以检索与http请求关联的上下文。
那么,为什么要在这些函数中使用上下文作为第一个参数来建议。在这种情况下合理吗?
我知道这不是限制规则。但我wan't知道为什么HandlerFunc
是func(ResponseWriter, *Request)
不是func(context.Context, ResponseWriter, *Request)
显然,HandlerFunc
打破了要求。
如您在上面引用的文档中所述,对于许多函数,它ctx
应该是(非常)通用的参数。这类似于许多函数返回的方式error
。公用参数/返回值的最佳位置是列表中的第一个或最后一个。(可以说,Go可以选择error
始终使它成为第一个返回值-在此不再赘述)。
由于可变参数可能仅是函数参数列表中的最后一个变量,因此,使公共参数成为第一个参数的唯一选择。
我希望这就是为什么ctx
总是第一。
在Go(和其他语言)中的其他变量中也经常看到这种模式。每当一组相关函数使用一个公共变量时,该公共变量通常在参数列表中排在首位(或者可能在第二个之后ctx
)。
与您引用的建议相反,有些库存储ctx
在结构中,而不是将其作为第一个参数传递。这些通常是(总是?)个库,必须ctx
在将库合同定下来后很长一段时间(必须通过Go 1.x兼容性保证)进行改装才能使用。
通常,ctx
对于任何新工作,您都应遵循建议作为第一个参数传递。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句