Go语言里简短声明语句词法域问题

Go语言里简短声明语句词法域问题

简短变量声明语句只有对已经在同级词法域声明过的变量才和赋值操作语句等价,如果变量是在外部词法域声明的,那么简短变量声明语句将会在当前词法域重新声明一个新的变量。

第一个程序

在第一个程序中,for循环内部的a := 1是一个新的变量声明,它只在for循环的块作用域内有效。这个新的局部变量a遮蔽(shadows)了外层的全局变量a。因此,最后打印a的值仍是5.

go 复制代码
package main

import "fmt"

func main() {
	a := 5
	fmt.Println(a)
	for i := 1; i < 3; i++ {
		a := 1
		fmt.Println(a)
	}
	fmt.Println(a)
}


开始 声明并初始化a为5 打印a的值 进入for循环 声明新的局部变量a为1 打印局部变量a的值 循环结束 打印全局变量a的值 结束

第二个程序

在这个程序中,for循环内部没有使用:=,这意味着a = 1是在修改外层作用域中的全局变量a。因此,在循环内部打印的是全局变量a的值,即1。由于全局变量a被修改了,所以循环结束后最后打印的也是1。

go 复制代码
package main

import "fmt"

func main() {
	a := 5
	fmt.Println(a)
	for i := 1; i < 3; i++ {
		a = 1
		fmt.Println(a)
	}
	fmt.Println(a)
}


开始 声明并初始化a为5 打印a的值 进入for循环 修改全局变量a为1 打印全局变量a的值 循环结束 打印全局变量a的值 结束

相关推荐
程序员大雄学编程12 小时前
「用Python来学微积分」16. 导数问题举例
开发语言·python·数学·微积分
Dreams_l12 小时前
redis中的数据类型
java·开发语言
梵得儿SHI12 小时前
Java IO 流详解:字符流(Reader/Writer)与字符编码那些事
java·开发语言·字符编码·工作原理·字符流·处理文本
太过平凡的小蚂蚁13 小时前
Kotlin 协程中常见的异步返回与控制方式(速览)
开发语言·前端·kotlin
007php00713 小时前
京东面试题解析:同步方法、线程池、Spring、Dubbo、消息队列、Redis等
开发语言·后端·百度·面试·职场和发展·架构·1024程序员节
想唱rap13 小时前
C++ list 类的使用
c语言·开发语言·数据结构·c++·笔记·算法·list
景彡先生13 小时前
Python函数定义与调用全解析:从基础语法到实战技巧
linux·开发语言·python
绝无仅有13 小时前
腾讯面试文章解析:MySQL慢查询,存储引擎,事务,结构算法等总结与实战
后端·面试·github
lingchen190614 小时前
MATLAB图形绘制基础(一)二维图形
开发语言·算法·matlab
松间沙路hba14 小时前
面试过程中的扣分项,你踩过几个?
面试·职场和发展