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不影响全局变量的值
}
posted @ 2023-01-19 00:37  john5的博客  阅读(19)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css