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

Neo Ko:

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

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

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

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


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

显然,HandlerFunc打破了要求。

lim

如您在上面引用的文档中所述,对于许多函数,它ctx应该是(非常)通用的参数。这类似于许多函数返回的方式error公用参数/返回值的最佳位置是列表中的第一个或最后一个。(可以说,Go可以选择error始终使它成为第一个返回值-在此不再赘述)。

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

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

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


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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么 FormRecord 不允许使用对象作为第一个参数?

为什么url_for()将“ static”作为第一个参数使用?没有static()

为什么线性回归不接受系列数据作为第一个参数?

为什么Blob构造函数只将数组作为第一个参数?

为什么fputs()需要常量作为第一个参数而不是fputc()?

为什么.fit()需要2D数组作为第一个参数?

为什么Redux示例将空对象作为第一个Object.assign()参数传递?

Collections.sort() 可以将 treeSet 作为第一个参数吗?如果不是为什么?

在Python中创建namedtuple时,为什么必须提供typename作为第一个参数

无法打开文件作为第一个参数

使xargs作为第一个参数传递

为什么在进程句柄对象上对 kernel32.TerminateProcess 的第一个参数使用整数转换?

为什么在调用时不需要在Swift中使用函数的第一个参数名?

为什么此功能将RAX作为第一个操作推入堆栈?

为什么arsort()将中心值作为第一个?

为什么IEnumerable的Where将第一个参数传递为“ this”

为什么函数是Haskell中的第一个参数

为什么xargs传递给subshell时会跳过第一个参数?

为什么此处要回显的字符串参数忽略了第一个单词?

为什么“函数”的第一个参数否定括号?

为什么不起作用:“ defn的第一个参数必须是符号”

为什么没有为方法/构造函数的第一个参数命名?

为什么x86汇编中的第一个参数从偏移8开始?

为什么ruby的system而不是shellescape是第一个参数?

为什么我不能打印传递给程序的第一个参数?

为什么 apply 跳过用于参数的数组的第一个元素?

为什么`decode(_:forKey:)`忽略其第一个参数?

为什么 argv 的第一个参数是 1 而不是 0

Razor 页面:为什么第一个参数为空