在 Go 语言(Golang)中,变量的作用域是一个非常重要的概念,它决定了变量在程序中的可见性和生命周期。Go 语言的作用域规则相对简单直观,主要基于词法作用域(也称为静态作用域或静态解析作用域)。
全局变量是在函数外部声明的变量,它们在整个包内都是可见的,但是只能被包内的代码访问(除非使用了export
关键字,但在 Go 中通常是通过首字母大写来实现公共可见性)。全局变量的生命周期贯穿整个程序执行期间。
package main
import "fmt"
var globalVar = "I am a global variable"
func main() {
fmt.Println(globalVar)
}
局部变量是在函数内部声明的变量,它们的作用域限制在声明它们的代码块(通常是一个函数或函数内的控制结构,如if
、for
、switch
等)内。一旦离开这个作用域,局部变量将不再可用。
package main
import "fmt"
func main() {
var localVar = "I am a local variable"
fmt.Println(localVar)
// localVar 在这里之后不再可用
}
函数参数是传递给函数的局部变量,它们的作用域限于函数体内。函数参数在函数被调用时接收外部传入的值,并在函数执行期间使用这些值。
package main
import "fmt"
func greet(name string) {
fmt.Println("Hello, " + name)
// name 仅在 greet 函数内可用
}
func main() {
greet("World")
}
在 Go 中,如果一个代码块(如一个函数或一个控制结构)被另一个代码块包含,内部代码块可以访问外部代码块中声明的变量,但不能直接访问外部代码块之外的变量。这被称为嵌套作用域。
package main
import "fmt"
func outerFunction() {
var outerVar = "I am outer"
func innerFunction() {
fmt.Println(outerVar) // 可以访问 outerVar
}
innerFunction()
}
func main() {
outerFunction()
// innerFunction() 和 outerVar 在这里都不可用
}
在Go语言中,形式参数(简称形参)是函数定义时出现的参数,它们可以看作是函数内部的占位符,用于接收函数调用时传递进来的实际参数(简称实参)的数据。形参在函数被调用之前并不占用实际的内存空间,也没有具体的值,只有在函数被调用时,才会根据实参的值进行初始化。
局部性:形参是函数内部的局部变量,它们的生命周期仅限于函数执行期间。一旦函数执行完毕,形参所占用的内存空间就会被释放。
初始化:形参在函数被调用时,会根据实参的值进行初始化。如果实参是通过值传递的方式传递的,那么形参会得到实参值的一份拷贝;如果实参是通过引用传递(在Go中通常是通过指针传递实现的)的方式传递的,那么形参会指向实参所引用的内存地址。
不可变性(对于值传递):在默认情况下,Go语言中的函数参数是通过值传递的方式传递的。这意味着在函数内部对形参的修改不会影响到实参的值。因为形参是实参值的一份拷贝,所以对形参的修改实际上是在修改这份拷贝,而不是实参本身。
可变性(对于引用传递):虽然Go语言本身不支持直接的引用传递,但可以通过传递指针的方式实现类似的效果。当实参是指针类型时,形参也会是指针类型,并指向实参所引用的内存地址。此时,在函数内部对形参所指向的内存地址中的内容进行修改,就会影响到实参所引用的内容。
package main
import "fmt"
// 值传递示例
func changeValue(a int) {
a += 100 // 修改形参a的值,不会影响实参
}
// 引用传递(通过指针)示例
func changeReference(a *int) {
*a += 100 // 修改形参a所指向的值,即实参的值
}
func main() {
x := 10
changeValue(x) // x的值不会改变
fmt.Println(x) // 输出: 10
changeReference(&x) // x的值会改变
fmt.Println(x) // 输出: 110
}
在上面的示例中,changeValue
函数通过值传递接收一个int
类型的参数,因此在函数内部对参数的修改不会影响到实参。而changeReference
函数通过指针传递接收一个int
类型的指针参数,因此在函数内部对指针所指向的内容的修改会影响到实参。
上一篇: Golang 语言函数
下一篇: Golang 语言数组