2.2.布尔值及其表达式
Go语言提供了两个内置的布尔值true和false,它们都是bool类型。Go语言支持标准的逻辑和比较操作符,这些操作的结果都是布尔值,参见表2.3.。
布尔值及其表达式被应用于if语句中,或者for语句的条件中,以及switch语句的case子句的条件判断中。
二元逻辑操作符(||和&&)使用短路逻辑。这意味着如果我们的表达式是b1||b2,并且表达式b1的计算结果为true,那么无论b2的值是什么,表达式的结果都为true,因为b2的值不会再计算而直接返回true。类似地,如果我们的表达式为b1&&b2,而表达式b1的计算结果为false,那么无论表达式b2的值是什么,都不会再计算它的值,而直接返回false。
Go语言对于那些使用比较操作符(<、<=、==、!=、>=、>)进行比较的值是严格审查的。这两个值必须是同一类型,或者——如果它们是接口,就必须实现相同的接口类型。如果有一个值是常量,则它的类型必须与其它的类型相兼容。这意味着一个无类型数值常量可以和另一个具有任意数值类型的值进行比较,但是不同类型且不是常量的数值不能直接比较,除非其中一个被显式转换成与其它数值相同的类型。
表2.3 布尔值及其比较操作符
!b | 逻辑非操作符;如果布尔表达式b的值为true,则结果为false |
a || b | 短路逻辑或操作符;如果布尔表达式a或b的值有一个为true,则结果为true |
a && b | 短路逻辑与操作符;如果布尔表达式a或b的值都为true,则结果为true |
x < y | 如果表达式x的值小于y的值,则结果为true |
x <= y | 如果表达式x的值小于等于y的值,则结果为true |
x == y | 如果表达式x的值等于y的值,则结果为true |
x != y | 如果表达式x的值不等于y的值,则结果为true |
x >= y | 如果表达式x的值大于等于y的值,则结果为true |
x > y | 如果表达式x的值大于y的值,则结果为true |
==和!=操作符可以用于任何可比较的类型,包括数组和结构体,但是它们的元素和成员变量要兼容==和!=操作符。这些操作符不能用于比较切片,不过可以通过使用Go标准库中的reflect.DeepEqua()函数来完成切片的比较。==和!=操作符也可以用于比较两个指针或者两个接口——或者将指针、接口或者引用(比如指向通道、映射或切片)与nil比较。其他的比较操作符(<、<=、>=和>)可能只适用于数字和字符串。(由于Go也跟c和Java一样,不支持操作符重载,对于自定义类型,我们可以根据需要来实现自己的比较方法或者函数。)