golang 变量作用域

package main

import "fmt"

// 全局作用域声明的函数
var f = func(i int) {
	fmt.Println("x")
}

// 全局作用域声明的整型
var m = 2

func main() {
	// 注意 1 : 不同作用域下,同名变量并不会导致编译失败,只是不推荐如此做,可能会得到意料之外的结果,增加程序复杂度

	// main 作用域内声明的函数--并初始化
	f := func(i int) {
		fmt.Println(i)
		if i > 0 {
			// 此处调用的是全局作用域的f()函数
			f(i - 1) // 初始化时用到了 f()函数,但此时本作用域内甚至main 作用域内都还没有f()函数,所以向上查找,找到了全局作用域的f()函数并调用
		}
	}
	f(10) // 此处调用时,main作用域已有f(),所以调用的是main里面生命的f()函数

	m := 12 + m    // 同理,初始化时的 m 其实是全局作用域的 m
	fmt.Println(m) // 此时的 m 已经声明完毕

	// 注意 2 :此时再声明一个同名变量报错:同一作用域下不可同名
	// m:= 12  这里报错

	// 这里扩展了一个独立作用域
	{
		m := m * 2     // 所以这里声明变量 m 是没问题的,因为本所用域内并不存在同名变量  且初始化时使用的 m 依然是上一级所用域的 m
		fmt.Println(m) // 输出结果 14 * 2
	}
}

看完代码看总结0.0
  • 同一作用域下不可存在相同变量名
  • 不同作用域,可以存在相同变量名称,变量调用时注意分析变量(可能引用的是上一级作用域的变量)
  • 作用域可扩展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值