持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
文章概览
- 深入理解函数
- 递归
一、函数
经常把一些功能、代码中多次使用的代码块包装成函数,因此达到更容易理解、减轻代码量的效果。
数据分配
- 基本数据类型一般会被分配到栈区,编译器存在逃逸分析。
- 引用数据类型一般会分配到堆区,编译器存在逃逸分析。
函数注意事项
- 函数的形参可以有多个,并且返回值也可以有多个。
- 形参和返回值的数据可以是值类型的也可以是引用类型的。
- 函数的命名和变量命名一样要遵循标识符命名规范,其首字母不可以是数字,大写可以被包外文件和函数访问,首字母小写就仅能被包内函数使用。
- 如果变量是在函数内声明的,那么也是局部的,不能在函数外使用。
- 基本数据类型和数组都是值传递(即进行值拷贝)。在函数内发生的修改,不会影响到原来的值。
- 当需要在函数内改变函数外变量的值时,可以传入变量的地址&,函数内以指针的方式操作变量,从效果上看类似引用。
- 在Go中,函数并不支持重载。
二、递归
基本介绍
如果一个函数自己调用了自己,则称其为递归调用。
代码示例
func main() {
fmt.Println(f(10)) // 55
}
func f(n int) (res int) {
if n < 2 {
return n
}
return f(n-1) + f(n-2) // f(10) = f(9) + f(8)
}
递归原则
- 当执行一个函数时,创建一个新的函数栈(受保护的独立空间)。
- 属于函数的局部变量是不会相互影响的,是独立的。
- 递归必须向结束递归的条件循进行,否则这就是死循环了。
- 如果一个函数执行完成,或者碰到return,就会返回,并且遵守谁调用,就将结果return给谁。