学习Golang中if和else语句的详细指南

155 阅读5分钟

学习Golang中if和else

条件式

任何程序都可以用三种控制结构来编写:

  • 序列结构,在这种结构中,表达式按照书写的顺序一个接一个地执行。
  • 选择结构,在这种结构中,一个语句是否被执行取决于某些条件;以及
  • 迭代结构,在这种结构中,语句可以被重复执行,直到某个条件变为真(或假)。

条件式是选择结构。它们提供了一种在程序中表达决策的方法。根据表达式的值,程序可以执行(或不执行)一个或多个语句。

Go提供了两个实现条件式的关键字:ifswitch 。本文重点介绍if 结构。

if

if 关键字开始一个选择语句。它对紧随其后的布尔表达式进行评估。如果表达式的值是true ,将执行一个语句块。如果值是false ,则不执行该语句块。语句块可以包含0个、1个或几个语句。

比如说:

package main

import (
  "fmt"
  "math/rand"
  "time"
)

func main() {
  // Initialize random number generator.
  r := rand.New(rand.NewSource(time.Now().UnixNano()))

  // Generate 2 small integer numbers.
  mine := r.Intn(10)
  yours := r.Intn(10)

  // Print out the random numbers.
  fmt.Println("Mine:", mine)
  fmt.Println("Yours:", yours)

  // Print out whether I won.
  if mine > yours {
    fmt.Println("I win.")
  }
}

当重复运行时,该程序会产生这样的输出:

❯ bin/go run conditionals/if.go
Mine: 5
Yours: 5

❯ bin/go run conditionals/if.go
Mine: 5
Yours: 0
I win.

❯ bin/go run conditionals/if.go
Mine: 2
Yours: 7

请注意,当 "我的 "的值大于 "你的 "的值时,它会打印出 "我赢了"。在其他情况下(如果相同或更小),它不会打印任何额外的信息。

请记住,if 后面的代码块可以有你需要的任意多的语句,而不是像例子中那样只有一条。它也可以没有语句--但在这种情况下,它将是相当无意义的。

比较运算符

Go的比较运算符(也称为 "关系 "运算符)对条件表达式特别有用。比如说:

操作符意义
==等于
!=不同于
>大于
<小于
>=大于或等于
<=小于或等于

这些运算符比较两个参数(向左和向右)并产生一个布尔结果,即truefalse ,取决于条件是否为真。

else

else 关键字,在if 语句中,当且仅当if 语句的表达式为false 时,执行一个代码块。

比如说:

package main

import (
  "fmt"
  "math/rand"
  "time"
)

func main() {
  // Initialize random number generator.
  r := rand.New(rand.NewSource(time.Now().UnixNano()))

  // Generate 2 integer numbers.
  limit := r.Intn(10)
  value := r.Intn(20)

  // Print out the random numbers.
  fmt.Println("Limit:", limit)
  fmt.Println("Value:", value)

  // Print out result of comparison.
  if value > limit {
    fmt.Println("Above limit.")
  } else {
    fmt.Println("Within limit.")
  }
}

当重复执行时,该程序将产生这样的输出:

❯ bin/go run conditionals/if-else.go
Limit: 4
Value: 4
Within limit.

❯ bin/go run conditionals/if-else.go
Limit: 9
Value: 7
Within limit.

❯ bin/go run conditionals/if-else.go
Limit: 6
Value: 19
Above limit.

请注意,当数值大于极限时,会打印出 "高于极限。"而当数值小于或等于极限时,会打印出 "在极限之内"。

请记住,ifelse 关键字后面的代码块可以有你需要的任意多的语句,而不是像例子中那样只有一条。

else if

else 关键字后面可以有另一个if 语句。如果前一个if 语句的表达式为假,而新的if 语句的表达式为真,那么新的if 语句块将被执行。

比如说:

package main

import (
  "fmt"
  "math/rand"
  "time"
)

func main() {
  // Initialize random number generator.
  r := rand.New(rand.NewSource(time.Now().UnixNano()))

  // Generate 2 integer numbers.
  limit := r.Intn(10)
  value := r.Intn(20)

  // Print out the random numbers.
  fmt.Println("Limit:", limit)
  fmt.Println("Value:", value)

  // Print out result of comparison.
  if value > limit {
    fmt.Println("Above limit.")
  } else if value < limit {
    fmt.Println("Under limit.")
  } else {
    fmt.Println("At the limit.")
  }
}

产生的输出结果是这样的:

❯ bin/go run conditionals/if-else-if.go
Limit: 1
Value: 1
At the limit.

❯ bin/go run conditionals/if-else-if.go
Limit: 8
Value: 14
Above limit.

❯ bin/go run conditionals/if-else-if.go
Limit: 4
Value: 2
Under limit.

注意,当值大于极限时,执行第一个if 语句的块;当值小于极限时,执行第二个if 语句的块;而当这两个条件都不是true ,即值和极限都相同时,执行最后一个else 语句的块。

请记住,你可以根据需要将尽可能多的else if ,每条语句都有不同的条件,必须为真才能执行其块。该序列可能有也可能没有最后的else 子句,后面没有新的if 语句。

else if链

else if 语句可以根据需要进行连锁,次数不限。第一个评价为 的条件的块将被执行,而其他的将被跳过。如果没有条件是 ,而有一个 子句,其块将被执行。如果没有一个 子句,那么该链就不会执行任何块。true true else else

比如说:

package main

import (
  "os"
  "bufio"
  "fmt"
  "strings"
)

func main() {
  // Ask the user to enter a number.
  reader := bufio.NewReader(os.Stdin)
  fmt.Print("What position did you finish at? ")
  positionInput, _ := reader.ReadString('\n')
  position := strings.TrimSuffix(positionInput, "\n")

  // Print out message for the position.
  if position == "1" {
    fmt.Println("Congrats! You finished in first place.")
  } else if position == "2" {
    fmt.Println("You were a close second.")
  } else if position == "3" {
    fmt.Println("You finished in third.")
  } else {
    fmt.Println("Better luck next time!")
  }
}

上面的程序产生这样的输出:

❯ bin/go run ./conditionals/if-else-chain.go
What position did you finish at? 1
Congrats! You finished in first place.

❯ bin/go run ./conditionals/if-else-chain.go
What position did you finish at? 2
You were a close second.

❯ bin/go run ./conditionals/if-else-chain.go
What position did you finish at? 3
You finished in third.

❯ bin/go run ./conditionals/if-else-chain.go
What position did you finish at? 4
Better luck next time!

经验之谈

  • Go提供了if 关键字,用于创建一个选择结构,只有在条件是true ,才会执行一个语句块。
  • 如果前面的条件不是true ,可选的else 子句将执行一个语句块。
  • 一个else 子句可以开始一个新的if 语句。该else 子句(和它的if 语句)只有在前面的if 语句的条件是false 时才会执行。
  • if,else ifelse 关键词的序列中只有一个块会被执行。
  • 如果没有if 条件是true ,也没有提供else 子句,那么将不执行任何语句。
  • 程序流将在整个if,else ifelse 块序列结束后的下一条语句上继续进行。
  • if 后面的条件可以根据需要复杂化。例如,它们可以使用Go的逻辑运算符&&,||,! )来组合多个布尔值。