当你学习一种新的编程语言时,可能会存在一个挫败期,就是当你无法使用更熟悉的语言来表达想法的时候。你很自然的想知道为什么语言要设计成这样,很容易误认为(当表达想法遇到困难时)这是语言设计者的失误。这种推理可能会导致你以一种非惯用的方法使用一种语言。
GoGoerrorError()例如,考虑一个解析主机地址并侦听 TCP 连接的函数。有两种出错的可能,因此需要有两个错误检查:
这个主题在 中有自己的条目,社区对此提出了广泛的意见。根据你过去的经验,你可能会倾向于认为:
Go一个稍长的例子
if这种写法还有一些不足之处:
errerr:=第一种选择:接受这种写法
ifGoGoGogoimportsGo非惯用方式
GoGoDefer, Panic, Recover
DeferPanicRecoverPanicRecovethrowcatchGoGopanic高阶函数和包装类型
Go我们不应该为此写一个映射函数吗?
Go 是一种没有泛型的静态类型语言,因此你可以在使用领域内声明特定类型的类型,或者完全放弃类型安全。
想象一下,如果你试图写的映射函数会是什么样子:
有一些放弃类型安全的选项,比如 。仔细研究示例代码可以看到,示例中通过使用接受任何类型的输出函数(` fmt.Println ` 最终使用反射确定参数类型)来仔细回避类型安全问题。
Scalahappy-pathsad-path但是看看你需要编写多少一次性代码才能支持这种写法:
Go回归本源
现在我们已经看到函数编程的形式并没有什么用处,这让我们:
Go_函数组
回顾一下示例代码,有两个明确的错误(输入没有以 CRLF 结束和 HTTP 请求格式不正确),一个清楚的成功响应和一个默认响应。为什么我们不将这些情况进行分组?
在这里,我们可以通过一些额外的函数使解析功能更小。你可以决定是选择更多的函数还是更大的函数。
正确和错误的路径并行
也可以重构现有的功能,同时处理正确和错误的路径。
parse错误闭包
你还可以在遇到第一个错误后创建一个闭包。文章中的示例代码如下所示:
作者编写了一个函数只要没有遇到错误,就会继续进行下一步操作
当你在处理过程中将每个步骤传递给闭包时,这种方法很有效,建议在每个步骤中应用相同的类型。在某些情况下,这可以很好地工作。
applyParseText / applyParseRequest / applyRoute总结
GoGoGoGo本文由 原创编译, 荣誉推出