区别就是你的无论是Ok还是Err,它们都是同一个类型Result。

这样有什么用呢?这样你就可以把一些调用串起来了,而不用每个都去 if err != nil。比如

因为他们都是同一个类型Result,所以你可以对Ok和Err应用同样的操作,而不一定必须要使用match来把数据取出来然后再分别处理。

在上面的result它还是一个Result,中间三个函数func1、func2、func3调用只要任何一个返回了Err,那么这个Err就是最终的返回值(and_then函数的作用),没有出错的话,那么结果就是最后一个闭包函数的结果,这里面是func3的结果。

这些函数并没有为哪个业务代码定制过,具有普适性,因为它们他们都是Result,通过and_then从一个Result转变成另一个Result而已。

而Go的err就不行了。

实际上这三个if err == nil都是同样的操作,但你却怎么都要写这么三个蛋疼的东西。

Result这个东西是个ADT (Algebraic Data Type),是函数式编程界已经普及了的东西。可以去看看OCaml, Haskell这些语言里面ADT的相关应用来感受一下它所带来的便捷性。

Rust里面的enum就是一个ADT,比较少用FP的同学可能会经常觉得需要用match去把数据取出来 好麻烦,其实ADT大多数时候都不是这么用的。很多时候都只需要在调用链的最后最后才去把结果取出来,中间的结果可以用各种抽象的函数去封装一些基本的操作来转换。比如标准库自带的Result和Option,初学Rust的同学就是喜欢调用unwrap()提前把它的结果取出来,这并没有什么必要。