函数调用机制
为了让大家更好的理解函数调用过程,看两个案例,并画出示意图,这个很重要。
1)传入一个数+1 test
对上图说明:
(1)在调用一个函数时,会给该函数分配一个新的空间,编译器会通过自身的处理,让这个新的空间和其它栈的空间区分开来。
(2)在每个函数对应的栈中,数据空间是独立的,不会混淆。
(3)当一个函数调用完毕(执行完毕)后,程序会销毁这个函数对应的栈空间。
2)计算两个数,并返回 getSum
//一个函数 test
func test(n1 int) {
n1 += 1
fmt.Println("test() n1=", n1) //? 输出结果=11
}
//一个函数 getSum
func getSum(n1 int, n2 int) int {
sum := n1 + n2
fmt.Println("getSum sum = ", sum)
//当函数有return语句时,就所将结果返回给调用者
//即谁调用我,就返回给谁
return sum
//也可以写成 return n1 + n2
}
func main() {
var n1 int = 10
//调用test
test(n1)
fmt.Println("main() n1=", n1) //? 输出结果= ?
sum := getSum(10, 20)
fmt.Println("main sum = ", sum)
}
return语句:
基本语法:
Go函数支持返回多个值,这一点是其它编程语言没有的。
func 函数名 (形参列表) (返回值类型列表) {
语句...
return 返回值列表
}
1)如果返回多个值时,在接收时,希望忽略某个返回值,则使用 _ 符号表示占位忽略。
2)如果返回值只有一个,(返回值类型列表) 可以不写()
案例1:
//声明函数 getSumAndSub
func getSumAndSub(n1 int, n2 int) (int, int) {
sum := n1 + n2
sub := n1 - n2
return sum, sub
}
func main() {
//调用getSumAndSub
res1, res2 := getSumAndSub(1, 2)
fmt.Printf("res1 = %v , res2 = %v", res1, res2)
}
案例2:
细节说明:希望忽略某个返回值, 则使用 _ 符号表示占位忽略
//声明函数 getSumAndSub
func getSumAndSub(n1 int, n2 int) (int, int) {
sum := n1 + n2
sub := n1 - n2
return sum, sub
}
func main() {
res3, _ := getSumAndSub(2, 3)
fmt.Printf("res3 = %v", res3)
}