函数调用机制

为了让大家更好的理解函数调用过程,看两个案例,并画出示意图,这个很重要。
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)
}

 

posted @ 2019-08-13 00:38  我是一只忙碌的小青蛙  阅读(370)  评论(0编辑  收藏  举报