作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。
Go 语言中变量可以在三个地方声明
函数内定义的变量称为 局部变量
函数外定义的变量称为 全局变量
函数定义中的变量称为 形式参数
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内。
在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用,全局变量可以在任何函数中使用。
形式参数会作为函数的局部变量来使用,作用域为函数内部。示例 :
package main
// 全局变量
var c int = 10
func test(i int) {
// d 为局部变量
// i 为形式参数
// 作用范围为本行内部
var d int = i
println(d)
}
func main() {
// d为局部变量此处无法打印
// println(d)
println(c)
}
1. 闭包是指有权访问另一个函数作用域中的变量的函数。
2. 创建闭包的常见方式就是在一个函数内部创建另一个函数, 内函数可以访问外函数的变量。
注意:闭包里作用域返回的局部变量不会被立刻销毁回收,但过度使用闭包可能会占用更多内存,导致性能下降。
示例 :
package main
import "fmt"
func getSequence() func() int {
i := 0
return func() int {
i += 1
return i
}
}
func main() {
/* nextNumber 为一个函数,函数 i 为 0 */
nextNumber := getSequence()
/* 调用 nextNumber 函数,i 变量自增 1 并返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* 创建新的函数 nextNumber1,并查看结果 */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}