持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
一、函数调用机制:
一、如何理解方法这个概念,给大家举个通俗易懂的方法:
二、函数-调用过程:
介绍:为了让大家更好的理解函数调用过程,举两个案例,并画出示意图
- 传入一个数 + 1 test
package main
import "fmt"
// 编写一个函数 test
func test(n1 int) {
n1 = n1 + 1
fmt.Println("test () 函数n1=", n1) // 输出结果= ???
}
func main() {
// 定义一个n1
n1 := 10
test(n1)
fmt.Println("main () 函数n1=", n1) // 输出结果= ???
}
逃逸分析:也有可能分配到堆区!
每一个方法都是压入一个栈帧,对象的实体和引用分配再堆区
对上面的图例的解释说明:
- 在调用一个函数的时候,会给该函数分配一个新的空间,编译器会通过自身处理让这个新的空间和其它的栈的空间区分开来。
- 在每个函数对应的栈中,数据空间是空间的,不会混淆。
- 当一个函数调用(执行)完毕之后,程序会销毁这个函数对应的栈空间。
- 计算两个数,并返回 getSum
package main
import "fmt"
// 编写一个函数 test
// func test(n1 int) {
// n1 = n1 + 1
// fmt.Println("test () 函数n1=", n1) // 输出结果= ???
// }
// 定义一函数 gerSum
func gerSum(n1 int, n2 int) int {
sum := n1 + n2
fmt.Println("getSum () 函数sum=", sum) // 输出结果= ???
// 当函数有 return 语句时,就是将这个结果返回给调用者
// 即谁调用我,就返回给谁
return sum
}
func main() {
// // 定义一个n1
// n1 := 10
// test(n1)
// fmt.Println("main () 函数n1=", n1) // 输出结果= ???
sum := gerSum(10, 20)
fmt.Println("main () 函数sum=", sum) // 输出结果= ???
}
三、return 语句:
一、基本语法:
GO 函数支持返回多个值,这一点是其它编程语言没有的。
func 函数名(形参列表)(返回值类型列表){
语句......
return 返回值列表
}
- 如果返回多个值,在接收的时候,希望忽略某个返回值,则可以使用
_符号表示占位忽略 - 如果返回值只有一个,(返回值类型列表)可以不写()
- 举例说明:
-
- 请编写一个函数,可以计算两个数的和和差,并返回结果。
package main
import "fmt"
// 请编写一个函数,可以计算两个数的和和差,并返回结果。
func getSumAndsub(n1 int, n2 int) (int, int) {
sum := n1 + n2
sub := n1 - n2
return sum, sub
}
func main() {
// 调用 getSumAndsu
res1, res2 := getSumAndsub(1, 2)
fmt.Printf("res1=%v res2=%v", res1, res2)
// 希望忽略某个返回值,则可以使用 _ 符号表示占位忽略
_, res3 := getSumAndsub(3, 9)
fmt.Println("res3=", res3)
}