「每週譯 Go」瞭解 Go 中的布爾邏輯
布爾數據類型(bool)可以是兩個值中的一個,即真或假。布爾型數據在編程中被用來進行比較和控制程序的流程。
Boolean 在 Go 中的數據類型是bool,全部小寫。值 true 和 false 總是分別用小寫的 t 和 f,因爲它們是 Go 中的特殊值。
本教程將涵蓋你需要了解 bool 數據類型如何工作的基礎知識,包括布爾比較、邏輯運算符和真值表。
比較運算符
在編程中,比較運算符被用來比較數值,並計算爲一個單一的布爾值,即真或假。
下表展示了布爾比較運算符。
運算符的含義
== 等於
!= 不等於
< 少於
> 大於
<= 少於等於
>= 大於等於
爲了瞭解這些運算符的工作原理,我們在 Go 程序中把兩個整數分配給兩個變量:
x := 5
y := 8
在這個例子中,由於 x 的值是5,y 的值是 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
第一個 = 是賦值運算符,它將設置一個值等於另一個值。第二個 == 是一個比較運算符,將評估兩個值是否相等。
邏輯運算符
有兩個邏輯運算符被用來比較數值。它們將表達式評估爲布爾值,返回 true 或 false。這些運算符是 &&,||,和 !,下面的列表中爲定義:
&& (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 > 7 和 2 < 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 後面的代碼塊,它決定了程序的結果。也就是說," 如果 x 是 true,那就往下執行 "。
下面的代碼塊顯示了一個比較運算符與條件語句協同工作的例子,以控制 Go 程序的流程:
if grade >= 65 { // Condition
fmt.Println("Passing grade") // Clause
} else {
fmt.Println("Failing grade")
}
這個程序將評估每個學生的成績是合格還是不合格。如果一個學生的成績是 83,第一條語句爲 true,並且將觸發 Passing grade 的打印語句。如果學生的成績是 59,第一條語句爲 false,所以程序將繼續執行與 else 表達式相關的打印語句:Failing grade。
布爾運算符提出的條件,可以通過流程控制語句來決定程序的最終結果。
總結
本教程介紹了屬於布爾類型的比較和邏輯運算符,以及真值表和使用布爾類型進行程序流程控制。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/BFAsVdEXQmteSTpBNDARIg