在之前视频里面讲过,如果利用go措辞去读mysqerror,去读redis,如果读不到数据,它会返回一个error。为什么这么设计?便是如果读到一个空构造体,空字符串,如果没有返回error,代表根据查询条件查不到对应的记录。如果没有到l,代表数据库里面确实存在这样的记录,只不过它对应的字段都为空值。
以是当从一个地方读到一个空值,这个空值能不能直接用取决于其余一个变量,便是error。本日再来举其余两个例子,来体会一下go措辞里面关于zero value的设计哲学。
来看这两段代码,非常大略。

·第一个是先搞了一个channel,紧接着把它给关闭了,然后去读这个channel。当channel已经关闭的情形之下,总是可以从里面读出数据的,纵然它为空,也能够读出对应的0值。这个0值取决于里面的数据类型,如果是整型,读出来的便是数字0。如果是字符串,读出来的便是空字符串。如果是bool类型,读出来的便是false。
以是这个时候就有一个困惑,便是读出来一个0,这个0是由于channel被关闭了,导致读出来0。还是由于别人往channel里面放了一个数字0,导致读出来0不知道。
·同理再来看下面这个map,mapkey是字符串,value是整型。根据这样一个key去读出对应的value,由于这个key里面实际上不存在这样一个key,读出来的value便是0值。这个0值便是整型,对应的0值便是数字0。
这个时候存在同样的困惑,也不知道是由于这个k它不存在,导致读出来value为0。还是由于这个k它存在,只不过它对的value本来便是0。
面对这两种困境怎么处理?go措辞的方案是返回两个值,实际上读channel还返回其余一个bool变量,这个bool变量仅当它为true的时候才可以放心大胆地去用value。同理去读一个map,它也会返回其余一个变量,也是一个bool值。仅当这个bool值为true的时候才可以放心大胆地去用value。一旦是加上这两个if判断,创造这两个print都不会输出。
总结一下go措辞关于0值的设计哲学,当从一个地方去读取数据,这个数据如果是0值如何判断是由于容器里面本来就放着一个0值,还是容器里面根本就不存在天命据?须要根据函数返回的其余一个变量来判断。