5week-4函数作用域
一.
- 作用域就是标识符,常量,变量在
for ,if, switch, 函数
,中的可见范围 - 函数天然就是作用域
1.块作用域
if,for,switch语句中 :=
定义的变量,都是只能在当前if for switch中使用,离开这个范围不可以使用,不可见
func main() {
//## 1.语句块作用域
t := []int{1, 3, 5, 7}
for i, v := range t {
fmt.Println(i, v)
}
if f, err := os.Open("d/aaa"); err != nil {
fmt.Println(err)
} else {
fmt.Println(f) //只能在for的区域中使用
}
}
2.块作用域 {}包起来的,变量只能在{}中使用
func block() {
const a = 100
var b = 200
c := 300
fmt.Println(a, b, c) 只能在{ }中使用
}
3.包作用域
// 在同一个目录中,顶层定义的变量,常量,函数,不区分大小写,在同一包内可见,作用域包内全局
//如果在包外使用,必须导出,包的全局,变量,常量,函数,首字母必须大写,
二.全局变量和函数变量
var a = 100 //全局的a变量和函数中的a变量,2个变量.你是你.我是我
func main() {
var a = 2000 //重新定义a变量.此时a是局部变量,只能在函数内可以使用
fmt.Println(a)
}
const a = 300全局的a常量和函数中的a常量,2个常量.你是你.我是我
func main() {
const a = 4000 //重新定义a常量,此时a是局部常量,只能在函数内可以使用
fmt.println(&a) //错误,常量不能取地址,因为常量是不可变的.防止修改常量
fmt.Println(a)
}
三.作用域分析
// package main
// import "fmt"
// var a = 100
// func main() {
// fmt.Println(1.1, a)
// a = 500 //重新赋值,main函数中没有a,那么使用全局变量a.把全局变量a修改为500
// fmt.Println(1.2, a)
// a := 1000
// fmt.Println(1.3, a)
// }
package main
import (
"fmt"
)
var a = 100
func showA() int {
return a
}
func main() {
fmt.Println(1.1, a)
a = 500 //重新赋值,main函数中没有a,那么使用全局变量a.把全局变量a修改为500
fmt.Println(1.2, a)
a := 1000
fmt.Println(1.3, a)
fmt.Println(1.4, showA())
{
const j = 'A'
var k = "sb"
t := 123
a = 700 //这种是赋值,会穿透使用上级的变量
b := 800 //这种里面重新定义的变量.对外是不可见的,是块中局部变量.块内可见
fmt.Println(1.5, j, k, t, a, b)
{
m := 900
fmt.Println(1.6, j, k, t, a, b, m) // j, k, t, a, b, m)会去上面的{ }里面去找
}
// fmt.Println(m) m在{}号外不可见
}
// fmt.Println(1.6, j, k, t, a, b, m) 在{}号外不可见
}
1.传变量副本,防止修改全局变量 1
- 写代码的时候.避免修改全局变量.比较危险,安全的做法是把全局变量重新赋值使用
package main
import "fmt"
var a = 100
func showA(a int) int { 当showA传入1000时候, a是showA函数的局部变量.showA函数中可见
fmt.Println(&a)
return a + 1
}
func main() {
a := 1000
fmt.Println(&a)
fmt.Println(showA(a)) //把a=1000的副本传入showA函数,此时showA函数中的a是,main中的a的副本,你是你,我是我,修改互不影响
fmt.Println(a)
}
- 结果
2.传变量副本,防止修改全局变量2
全局变量副本传入函数
package main
var c = 1200
func showC(i int) int {
return c + 111
}
func main() {
showC(c) //把全局变量副本传入showC不影响全局变量的值
}