Menu
CoddyTech

`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。

challenge icon

挑战

入门

在这个挑战中,你将练习在 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)
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Go 在线编译器