`if` 中的变量遮蔽
本课属于 Coddy GO 学习旅程的“基础知识”单元。第 37 课,共 109 课。
我们来学习 if 语句中的变量遮蔽。if 语句可以在条件之前声明一个变量,这个变量只在 if 代码块及其相关的 else 代码块中存在。如果它和 if 外部的变量同名,那么在这些代码块中,它会遮蔽(隐藏)外部变量。
首先,我们在条件语句外创建一个变量:
x := 10
fmt.Println("Original x value:", x)运行这段代码后,我们会得到一个值为 10 的变量 x,可以在整个程序中使用它。
现在,我们在 if 语句中声明一个新变量 y。它只在 if 和 else 代码块中存在:
if y := x * 2; y > 15 {
fmt.Println("y is greater than 15:", y)
// y 只在这个代码块中存在
} else {
fmt.Println("y is not greater than 15:", y)
// 在 else 代码块中也可以使用 y
}执行这段代码后,Go 会将 y 计算为 20(也就是 x * 2),检查它是否大于 15,然后执行第一个代码块。屏幕上会显示以下输出:
y is greater than 15: 20最后,我们试着在 if 语句之后访问变量:
// fmt.Println(y) 会导致错误,因为这里不存在 y。
fmt.Println("x is still:", x)执行这段代码后,我们仍然可以访问 x,但无法再访问 y,因为它只在 if 和 else 代码块中存在。屏幕上会显示以下输出:
x is still: 10这展示了在 if 语句中声明的变量的作用域:变量 y 只能在声明它的条件代码块中访问。这里没有外部的 y,因此不会遮蔽任何变量。如果我们将它命名为 x,那么它会在这些代码块中遮蔽外部的 x,而这些代码块执行完后,外部的 x 仍然是 10。
挑战
入门在这个挑战中,你将练习在 if 语句中使用变量遮蔽。你会看到,在 if 代码块中声明的变量可以与外层作用域中的变量同名,但值不同。
代码在外层作用域中有一个 message 变量。你的任务是在 if 代码块中创建一个同名的遮蔽变量,然后打印这两个变量,看看变量遮蔽的效果。
亲手试试
package main
import "fmt"
func main() {
// 外层作用域中的变量
message := "Hello from outer scope"
isLoggedIn := true
if isLoggedIn {
// TODO:创建一个名为 'message' 的新变量,值为 "Hello from inner scope"
// 这里会输出内层作用域中的消息
fmt.Println(message)
}
// 这里会输出外层作用域中的消息
fmt.Println(message)
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Go 在线编译器