「每週譯 Go」如何在 Go 中編寫條件語句


介紹

條件性語句是每一種編程語言的組成部分。通過條件語句,我們可以讓代碼有時運行,有時不運行,這取決於當時程序的條件。

當我們完全執行程序的每個語句時,我們並沒有要求程序評估特定的條件。通過使用條件語句,程序可以確定某些條件是否被滿足,然後被告知下一步該做什麼。

讓我們來看看一些使用條件語句的例子。

通過評估條件,並根據是否滿足這些條件來分配代碼運行,我們就是在寫條件代碼。

本教程將帶你瞭解在 Go 編程語言中編寫條件語句。

If 語句

我們將從 if 語句開始,它將評估一個語句是真的還是假的,並且只在該語句爲真的情況下運行代碼。

在一個純文本編輯器中,打開一個文件,寫入以下代碼:

package main

import "fmt"

func main() {
 grade := 70

 if grade >= 65 {
  fmt.Println("Passing grade")
 }
}

在這段代碼中,我們有一個變量grade,並給它一個整數值70。然後我們使用if語句來評估變量grade是否大於或等於(>=65。如果它確實滿足這個條件,我們告訴程序打印出字符串(點擊查看往期推文) Passing grade

將程序保存爲grade.go,並在終端窗口(點擊查看往期推文) 中用go run grade.go命令運行它。

在這種情況下,70 分的成績 * 符合大於或等於 65 分的條件,因此,一旦你運行該程序,你將收到以下輸出:

Passing grade

現在讓我們改變這個程序的結果,把grade變量的值改爲60

package main

import "fmt"

func main() {
 grade := 60

 if grade >= 65 {
  fmt.Println("Passing grade")
 }
}

當我們保存並運行_這個_代碼時,我們不會收到任何輸出,因爲條件 * 沒有得到滿足,我們也沒有告訴程序執行另一條語句。

再舉一個例子,讓我們計算一個銀行賬戶餘額是否低於 0。讓我們創建一個名爲account.go的文件,並編寫以下程序:

package main

import "fmt"

func main() {
 balance := -5

 if balance < 0 {
  fmt.Println("Balance is below 0, add funds now or you will be charged a penalty.")
 }
}

當我們用go run account.go運行該程序時,我們會收到以下輸出:

Balance is below 0, add funds now or you will be charged a penalty.

在程序中,我們將變量balance初始化爲5,即小於 0。由於balance符合if語句的條件(balance<0),一旦我們保存並運行代碼,我們將收到字符串的輸出。同樣,如果我們把餘額改爲 0 或一個正數,我們將不會收到任何輸出。

Else 語句

我們很可能希望程序在 if語句評估爲假時也能有所作爲。在我們的成績例子中,我們希望輸出成績是合格還是不合格。

要做到這一點,我們將在上面的成績條件中添加一個 else 語句,其結構如下:

package main

import "fmt"

func main() {
 grade := 60

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

由於成績變量的值是60if語句評估爲假,所以程序不會打印出Passing grade。接下來的 else 語句告訴程序無論如何都要做一些事情。

當我們保存並運行該程序時,我們將收到以下輸出:

Failing grade

如果我們重寫程序,給成績一個65或更高的值,我們將收到Passing grade的輸出。

爲了給銀行賬戶的例子增加一個 else 語句,我們這樣改寫代碼:

package main

import "fmt"

func main() {
 balance := 522

 if balance < 0 {
  fmt.Println("Balance is below 0, add funds now or you will be charged a penalty.")
 } else {
  fmt.Println("Your balance is 0 or above.")
 }
}
Your balance is 0 or above.

在這裏,我們把balance變量的值改爲正數,這樣else語句就會打印出來。爲了讓第一個if語句打印出來,我們可以把這個值改寫成一個負數。

通過將if語句和else語句結合起來,你就構建了一個由兩部分組成的條件語句,無論if條件是否滿足,都會告訴計算機執行某些代碼。

Else if 語句

到目前爲止,我們已經爲條件語句提出了一個布爾(點擊查看往期推文) 選項,每個if語句的評估結果爲真或假。在許多情況下,我們會希望一個程序能評估出兩個以上的可能結果。爲此,我們將使用 else if 語句,在 Go 中寫成else ifelse if或 else if 語句看起來和if語句一樣,將評估另一個條件。

在銀行賬戶程序中,我們可能希望在三種不同的情況下有三個離散的輸出。

else if語句將被放在 if 語句和 else 語句之間,如下所示:

package main

import "fmt"

func main() {
 balance := 522

 if balance < 0 {
  fmt.Println("Balance is below 0, add funds now or you will be charged a penalty.")
 } else if balance == 0 {
  fmt.Println("Balance is equal to 0, add funds soon.")
 } else {
  fmt.Println("Your balance is 0 or above.")
 }
}

現在,一旦我們運行該程序,有三種可能的輸出:

如果我們想有三個以上的可能性呢?我們可以通過在代碼中寫一個以上的else if語句來實現。

grade.go程序中,讓我們重寫代碼,以便有幾個字母等級對應於數字等級的範圍。

要運行這段代碼,我們將需要一個if語句,三個else if語句,以及一個處理所有失敗情況的else語句。

讓我們重寫前面的例子中的代碼,讓字符串打印出每個字母等級。我們可以保持我們的else語句不變。

package main

import "fmt"

func main() {
 grade := 60

 if grade >= 90 {
  fmt.Println("A grade")
 } else if grade >= 80 {
  fmt.Println("B grade")
 } else if grade >= 70 {
  fmt.Println("C grade")
 } else if grade >= 65 {
  fmt.Println("D grade")
 } else {
  fmt.Println("Failing grade")
 }
}

由於else if語句將按順序評估,我們可以保持我們的語句相當基本。這個程序正在完成以下步驟。

  1. 如果成績大於 90,程序將打印 "A 級",如果成績小於 90,程序將繼續下一個語句...。

  2. 如果成績大於或等於 80,程序將打印 "B 級",如果成績在 79 或以下,程序將繼續下一個語句......

  3. 如果成績大於或等於 70,程序將打印 "C 級",如果成績是 69 或更少,程序將繼續下一個語句......

  4. 如果成績大於或等於 65,程序將打印 "D 級",如果成績是 64 或更少,程序將繼續下一個語句......

  5. 程序將打印 "成績不合格",因爲上述所有的條件都沒有滿足。

嵌套的 If 語句

一旦你對 if, else if, 和 else語句感到滿意,你就可以轉到嵌套條件語句。我們可以使用嵌套的if語句來處理這樣的情況:如果第一個條件執行爲真,我們想檢查第二個條件。爲此,我們可以在另一個 if-else 語句中設置一個 if-else 語句。讓我們來看看嵌套的if語句的語法。

if statement1 { // outer if statement
 fmt.Println("true")

 if nested_statement { // nested if statement
  fmt.Println("yes")
 } else { // nested else statement
  fmt.Println("no")
 }

} else { // outer else statement
 fmt.Println("false")
}

這段代碼可以產生一些可能的輸出。

true
yes
true
no
false

我們也可以在代碼中嵌套多個if語句:

if statement1 { // outer if
 fmt.Println("hello world")

 if nested_statement1 { // first nested if
  fmt.Println("yes")

 } else if nested_statement2 { // first nested else if
  fmt.Println("maybe")

 } else { // first nested else
  fmt.Println("no")
 }

} else if statement2 { // outer else if
 fmt.Println("hello galaxy")

 if nested_statement3 { // second nested if
  fmt.Println("yes")
 } else if nested_statement4 { // second nested else if
  fmt.Println("maybe")
 } else { // second nested else
  fmt.Println("no")
 }

} else { // outer else
 statement("hello universe")
}

在這段代碼中,除了 else if 語句外,每個 if 語句內都有一個嵌套的 if 語句。這將使每個條件內有更多的選項。

讓我們用grade.go程序來看一個嵌套if語句的例子。可以首先檢查一個成績是否合格(大於或等於 65%),然後評估數字成績應該相當於哪個字母等級。如果成績不合格,我們就不需要運行字母等級,而可以讓程序報告該成績不合格。修改後的代碼和嵌套的 if 語句看起來是這樣的:

package main

import "fmt"

func main() {
 grade := 92
 if grade >= 65 {
  fmt.Print("Passing grade of: ")

  if grade >= 90 {
   fmt.Println("A")

  } else if grade >= 80 {
   fmt.Println("B")

  } else if grade >= 70 {
   fmt.Println("C")

  } else if grade >= 65 {
   fmt.Println("D")
  }

 } else {
  fmt.Println("Failing grade")
 }
}

如果我們在運行代碼時將變量grade設置爲整數值92,那麼第一個條件就得到了滿足,程序將打印出Passing grade of:。接下來,它將檢查成績是否大於或等於 90,由於這個條件也被滿足,它將打印出A

如果我們在運行代碼時將grade變量設置爲60,那麼第一個條件就沒有得到滿足,所以程序將跳過嵌套的if語句,向下移動到else語句,程序將打印出Failing grade

當然,我們可以在此基礎上增加更多的選項,並使用第二層嵌套的 if 語句。也許我們想對 A+、A 和 A - 的成績分別進行評估。我們可以這樣做,首先檢查成績是否合格,然後檢查成績是否在 90 分或以上,然後檢查成績是否在 96 分以上爲 A+:

...
if grade >= 65 {
 fmt.Print("Passing grade of: ")

 if grade >= 90 {
  if grade > 96 {
   fmt.Println("A+")

  } else if grade > 93 && grade <= 96 {
   fmt.Println("A")

  } else {
   fmt.Println("A-")
  }
...

在這段代碼中,對於設置爲 96 的 grade 變量,程序將運行以下程序。

  1. 檢查該等級是否大於或等於 65(真)。

  2. 打印出 Passing grade of:

  3. 檢查成績是否大於或等於 90(真)。

  4. 檢查成績是否大於 96(假)。

  5. 檢查等級是否大於 93,同時小於或等於 96(真)。

  6. 打印 "A"。

  7. 離開這些嵌套的條件語句,繼續執行剩餘的代碼

因此,成績爲 96 的程序的輸出看起來是這樣的:

Passing grade of: A

嵌套的if語句可以提供機會,在你的代碼中添加幾個特定級別的條件。

總結

通過使用像 if 語句這樣的條件語句,你將對你的程序執行內容有更大的控制。條件性語句告訴程序要評估是否滿足某個條件。如果滿足條件,它將執行特定的代碼,但如果不滿足條件,程序將繼續執行其他代碼。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/siO-wn7_GlvMJJd42Bv5Uw