探索Go语言的设计哲学:从零开始

发表时间: 2024-07-12 07:05

zero value的设计哲学。

在之前视频里面讲过,如果使用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值,还是容器里面根本就不存在定数据?需要根据函数返回的另外一个变量来判断。