持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
文章概览
- 函数参数的传递方式
- 变量作用域
一、函数参数的传递方式
前面已经知道函数参数传递的两种方式:值传递和引用类型,值传递的参数是值,而引用类型参数是地址。
两种方式共同点是传递给函数的都是副本,不同的是值传递是数值拷贝,而引用类型传递是地址的拷贝传递。因为引用类型只需要传递地址,数据量一般较小,效率高,而值类型的传递效率取决于数据的大小,数据越大效率越低,反之效率越高。
值类型和引用类型在内存中的特点
- 值类型变量直接存储值,内存一般在栈中分配。
- 引用类型的变量存储的是地址,地址所指向的空间才是真正的数值。引用类型的内存在堆上分配,当没有变量引用这块地址,这块地址就会变成垃圾,由GC回收。
二、变量作用域
- 局部变量:变量内部声明/定义的变量,作用域仅限于函数内部。
package main
import package main
import "fmt"
func GetD() (int, int) {
return 100, 200
}
func main() {
a, _ := GetD()
_, b := GetD()
fmt.Println(a, b)
}
- 全局变量:函数外部声明/定义的变量,作用域在整个包都有效,如果首字母大写,那么作用域在整个程序有效。
代码示例
//变量作用域
package main
import (
"fmt"
)
//全局变量作用域
var Age int = 10
func test() int{
Age = 20
fmt.Println(Age)
return Age
}
func main() {
fmt.Println(Age)
f := test()
fmt.Println(f)
}
- 如果变量在一个代码块中,比如for/if中,则该变量的作用域在该代码块中。
代码示例
package main
import (
"fmt"
)
func main() {
for i := 0; i <= 5; i++ {
fmt.Println("i=", i)
}
var i int // 局部变量
for i = 0; i <= 5; i++ {
fmt.Println("i=", i)
}
fmt.Println("i=", i)
}