学习Golang中if和else
条件式
任何程序都可以用三种控制结构来编写:
- 序列结构,在这种结构中,表达式按照书写的顺序一个接一个地执行。
- 选择结构,在这种结构中,一个语句是否被执行取决于某些条件;以及
- 迭代结构,在这种结构中,语句可以被重复执行,直到某个条件变为真(或假)。
条件式是选择结构。它们提供了一种在程序中表达决策的方法。根据表达式的值,程序可以执行(或不执行)一个或多个语句。
Go提供了两个实现条件式的关键字:if 和switch 。本文重点介绍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的比较运算符(也称为 "关系 "运算符)对条件表达式特别有用。比如说:
| 操作符 | 意义 |
|---|---|
| == | 等于 |
| != | 不同于 |
| > | 大于 |
| < | 小于 |
| >= | 大于或等于 |
| <= | 小于或等于 |
这些运算符比较两个参数(向左和向右)并产生一个布尔结果,即true 或false ,取决于条件是否为真。
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.
请注意,当数值大于极限时,会打印出 "高于极限。"而当数值小于或等于极限时,会打印出 "在极限之内"。
请记住,if 和else 关键字后面的代码块可以有你需要的任意多的语句,而不是像例子中那样只有一条。
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 if和else关键词的序列中只有一个块会被执行。- 如果没有
if条件是true,也没有提供else子句,那么将不执行任何语句。 - 程序流将在整个
if,else if和else块序列结束后的下一条语句上继续进行。 if后面的条件可以根据需要复杂化。例如,它们可以使用Go的逻辑运算符(&&,||,!)来组合多个布尔值。