函数参数的传递方式和变量作用域
函数参数的传递方式:
基本介绍:
我们在讲解函数注意事项和使用细节时,已经讲过值类型和引用类型了,这里我们在系统总结一下,因为这是重难点,值类型参数默认就是值传递,而引用类型参数默认就是引用传递。
两种传递方式:
1)值传递
2)引用传递
其实,不管是值传递还是引用传递,传递给函数的都是变量的副本,不同的是,值传递的是值的拷贝,引用传递的是地址的拷贝,一般来说,地址拷贝效率高,因为数据量小,而值拷贝决定拷贝的数据大小,数据越大,效率越低。
值类型和引用类型:
1)值类型:基本数据类型 int 系列,float系列,bool,string、数组和结构体struct
2)引用类型:指针、slice切片、map、管道chan、interface 等都是引用类型
变量作用域:
说明:
1)函数内部声明/定义的变量叫局部变量,作用域仅限于函数内部
func test() {
//age 和 Name 的作用域就只在test函数内部
age := 10
Name := "tom~"
}
func main() {
//这里是不能调用上面函数的变量的。
}
2)函数外部声明/定义的变量叫全局变量,作用域在整个包都有效,如果其首字母为大写,则作用域在整个程序有效。
package main
import (
"fmt"
)
var age int = 50
var Name string = "jack~"
func test() {
//age 和 Name 的作用域就只在test函数内部
age := 10
Name := "tom~"
fmt.Println("age = ", age) //10
fmt.Println("Name = ", Name) //tom~
}
func main() {
fmt.Println("age = ", age) //50
mt.Println("Name = ", Name) //jack~
test()
}
3)如果变量是在一个代码块,比如 for / if 中,那么这个变量的作用域就在该代码块。
for i := 0; i <= 10; i++ {
fmt.Println("i=", i)
}
// fmt.Println("i=",i) 这里就调用不了for循环中的变量i
练习题:
思考:下面的代码输出什么内容?
var Age int = 20 //ok
Name := "tom" //这句话相当于执行了下面两句 var Name string Name = "tom" 所以在编译的时候会报错,赋值语句是不能在函数体外。
func main() {
fmt.Println("name",Name)
}