什么是optional
试想一下,当你有一个电商系统,然后需要设计一个接口去获取注册的用户的地址的时候,一般这个接口的返回值类型会是string,但是如果你调用这个接口时得到一个返回值为空字符串,你会怎么认为它的含义?是用户设置的就是空字符吗?还是用户没有设置呢?
这种问题一般有种办法可以解决,就是把返回值类型改成指针,如果是空指针,就是没设置,如果不是空指针,则表示是设置的空字符,但是这样引入指针之后就会显得不那么优雅,可能还会引入额外的空指针问题。
这时候有另外一种方法就是用optional去处理,optional是一个复合类型,当声明一个string类型的optional的时候,该变量会有一个额外的接口IsPresent,如果这个变量是被赋了值的话,IsPresent就会返回true,便可以进一步取到该string的值,否则IsPresent会直接返回false。
怎么实现optional
optional在java和C++中都已经内置,java是在java 8引入的,C++是在C++17引入的,但是在golang里面并没有内置这个类型,那么我们可以动手实现一个。
我参考java的接口设计实现了一个,把实现好的放在如下链接了,大家可以直接取用或贡献代码: