14 Understanding Boolean Logic in Go

了解 Go 中的布尔逻辑 #

布尔数据类型(bool)可以是两个值中的一个,即。布尔型数据在编程中被用来进行比较和控制程序的流程。

Boolean 在 Go 中的数据类型是bool,全部小写。值 truefalse 总是分别用小写的 tf,因为它们是 Go 中的特殊值。

本教程将涵盖你需要了解 bool 数据类型如何工作的基础知识,包括布尔比较、逻辑运算符和真值表。

比较运算符 #

在编程中,比较运算符被用来比较数值,并计算为一个单一的布尔值,即真或假。

下表展示了布尔比较运算符。

运算符的含义

== 等于

!= 不等于

< 少于

> 大于

<= 少于等于

>= 大于等于

为了了解这些运算符的工作原理,我们在 Go 程序中把两个整数分配给两个变量:

x := 5
y := 8

在这个例子中,由于 x 的值是5y 的值是 8,所以 x 小于 y

使用这两个变量和它们的相关值,让我们回忆一下之前的运算符。在这个程序中,你用 Go 打印出每个比较运算符的值是真还是假。为了帮助更好地理解这个输出,Go 打印一个字符串来显示它正在计算的内容。

package main
    
import "fmt"
    
func main() {
    x := 5
    y := 8
    
    fmt.Println("x == y:", x == y)
    fmt.Println("x != y:", x != y)
    fmt.Println("x < y:", x < y)
    fmt.Println("x > y:", x > y)
    fmt.Println("x <= y:", x <= y)
    fmt.Println("x >= y:", x >= y)
}
Output
x == y: false
x != y: true
x < y: true
x > y: false
x <= y: true
x >= y: false

遵循数学逻辑,Go 从表达式中计算了以下内容:

  • 5(x)等于 8(y)吗?
  • 5 不等于 8 吗?
  • 5 小于 8 吗?
  • 5 是否大于 8?
  • 5 是否小于或等于 8?
  • 5 不小于或等于 8 吗?

虽然这里使用的是整数,但你可以用浮点数来代替。

字符串也可以和布尔运算符一起使用。它们是区分大小写的,除非你使用一个额外的字符串方法。

你可以看一下字符串在实践中是如何比较的:

Sammy := "Sammy"
sammy := "sammy"

fmt.Println("Sammy == sammy: ", Sammy == sammy)
Output
Sammy == sammy:  false

字符串 Sammy 不等于字符串 sammy,因为它们不完全相同;一个以大写字母 S 开头,另一个以小写字母 s 开头。但是,如果你添加了另一个变量,该变量被分配了 Sammy 的值,那么它们的值将相等。

Sammy := "Sammy"
sammy := "sammy"
alsoSammy := "Sammy"
    
fmt.Println("Sammy == sammy: ", Sammy == sammy)
fmt.Println("Sammy == alsoSammy", Sammy == alsoSammy)
Output
Sammy == sammy:  false
Sammy == alsoSammy true

你还可以使用其他比较运算符,包括 >< 来比较两个字符串。Go 将使用字符的 ASCII 值对这些字符串进行按字母顺序的比较。

你也可以用比较运算符计算布尔值:

t := true
f := false
    
fmt.Println("t != f: ", t != f)
Output
t != f:  true

前面的代码块计算了 true 不等于 false

注意两个运算符 === 之间的区别。

x = y   // Sets x equal to y
x == y  // Evaluates whether x is equal to y

第一个 = 是赋值运算符,它将设置一个值等于另一个值。第二个 == 是一个比较运算符,将评估两个值是否相等。

逻辑运算符 #

有两个逻辑运算符被用来比较数值。它们将表达式评估为布尔值,返回 truefalse。这些运算符是 &&||,和 ,下面的列表中为定义:

&& (x && y) 是 and 运算符。如果两个语句都是真,它就是真。
|| (x || y) 是 or 运算符。如果至少有一个语句是真,它就是真。
! (!x)是 not 运算符。只有当语句为假时,它才为真。

逻辑运算符通常用于计算两个或多个表达式是真还是假。例如,它们可以用来确定成绩是否合格,以及学生是否在课程中注册,如果这两种情况都是真,那么该学生将在系统中被分配一个成绩。另一个例子是根据用户是否有商店信用或在过去6个月内有购买行为,来确定用户是否是一个网上商店的有效活跃客户。

为了理解逻辑运算符的工作原理,我们来评估三个表达式:

fmt.Println((9 > 7) && (2 < 4))   // Both original expressions are true
fmt.Println((8 == 8) || (6 != 6)) // One original expression is true
fmt.Println(!(3 <= 1))            // The original expression is false
Output
true
true
true

在第一种情况下,fmt.Println((9 > 7) && (2 < 4))9 > 72 < 4 都计算为真,因为使用了and 运算符。

在第二种情况下,fmt.Println((8 == 8) || (6 != 6)),由于8 == 8 为真,6 != 6 为假,因为使用了 or 运算符所以结果为真。如果你使用的是 and 运算符,那么这个结果将是假。

在第三种情况下,fmt.Println(!(3 <= 1))not 运算符否定了 3 <=1 返回的错误值。

让我们用浮点数代替整数,并以假为目标:

fmt.Println((-0.2 > 1.4) && (0.8 < 3.1))  // One original expression is false
fmt.Println((7.5 == 8.9) || (9.2 != 9.2)) // Both original expressions are false
fmt.Println(!(-5.7 <= 0.3))               // The original expression is true

在这个例子中:

  • and 必须至少有一个假则计算为假。
  • or 必须两个表达式都为假则计算为假。
  • ! 必须使其内部表达式为真,新表达式才为假。

如果这些结果对你来说不清楚,可以通过一些真值表来进一步澄清。

你也可以用 &&|| 来写复合语句:

!((-0.2 > 1.4) && ((0.8 < 3.1) || (0.1 == 0.1)))

先看一下最里面的表达式:(0.8 < 3.1) || (0.1 == 0.1)。这个表达式计算为 true,因为两个数学语句都是 true

接下来,Go 将返回值 true 与下一个内部表达式相结合:(-0.2 > 1.4) && (true)。这个例子返回false,因为数学语句 -0.2 > 1.4 是假,而(false)和(true)返回 false

最后,我们有一个外层表达式:!(false),它的值是 true,所以如果我们把这个语句打印出来,最后的返回值是:

Output
true

逻辑运算符 &&|| 用于计算并返回布尔值。

真值表 #

关于数学的逻辑分支,有很多东西需要学习,但你可以有选择地学习一些,以提高你编程时的算法思维。

下面是比较运算符 ==,以及每个逻辑运算符 &&|| 的真值表。虽然你可能能够推理出它们,但记住它们也是有帮助的,因为这可以使你的编程决策过程更快。

== (equal) 真值表

x == y 返回

true == true true

true == false false

false == true false

false == false true

&& (and) 真值表

x and y 返回

true and true true

true and false false

false and true false

false and false false

|| (or) 真值表

x or y 返回

true or true true

true or false true

false or true true

false or false false

! (not) 真值表

not x Returns

not true false

not false true

真值表是逻辑学中常用的数学表,在构建计算机编程中的算法(指令)时,真值表是很有用的,可以牢记在心。

使用布尔运算符进行流程控制 #

为了以流程控制语句的形式控制程序的流程和结果,你可以使用一个 condition 和一个 clause

一个 condition 计算出一个布尔值的真或假,提出了一个在程序中做出决定的点。也就是说,一个条件会告诉你某个东西的值是真还是假。

clause 是跟在 condition 后面的代码块,它决定了程序的结果。也就是说,“如果 xtrue,那就往下执行”。

下面的代码块显示了一个比较运算符与条件语句协同工作的例子,以控制 Go 程序的流程:

if grade >= 65 {                 // Condition
    fmt.Println("Passing grade") // Clause
} else {
    fmt.Println("Failing grade")
}

这个程序将评估每个学生的成绩是合格还是不合格。如果一个学生的成绩是 83,第一条语句为 true,并且将触发 Passing grade 的打印语句。如果学生的成绩是 59,第一条语句为 false,所以程序将继续执行与 else 表达式相关的打印语句:Failing grade

布尔运算符提出的条件,可以通过流程控制语句来决定程序的最终结果。

总结 #

本教程介绍了属于布尔类型的比较和逻辑运算符,以及真值表和使用布尔类型进行程序流程控制。