【第十六篇】一文搞懂_GO语言_函数调用机制底层剖析🔥🔥

103 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

一、函数调用机制:

一、如何理解方法这个概念,给大家举个通俗易懂的方法:

二、函数-调用过程:

介绍:为了让大家更好的理解函数调用过程,举两个案例,并画出示意图

  1. 传入一个数 + 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) // 输出结果= ???
}

逃逸分析:也有可能分配到堆区!

每一个方法都是压入一个栈帧,对象的实体和引用分配再堆区

对上面的图例的解释说明:

  1. 在调用一个函数的时候,会给该函数分配一个新的空间,编译器会通过自身处理让这个新的空间和其它的栈的空间区分开来。
  2. 在每个函数对应的栈中,数据空间是空间的,不会混淆。
  3. 当一个函数调用(执行)完毕之后,程序会销毁这个函数对应的栈空间。

  1. 计算两个数,并返回 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 返回值列表

}

  1. 如果返回多个值,在接收的时候,希望忽略某个返回值,则可以使用 _ 符号表示占位忽略
  2. 如果返回值只有一个,(返回值类型列表)可以不写()
  3. 举例说明:
    1. 请编写一个函数,可以计算两个数的和和差,并返回结果。
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)
}