函数: 一段代码的集合
面向对象里才有方法
main函数是程序的入口~
func 函数名(参数名 参数类型 ... ){
}
函数的具体定义
- 无参无返回值
- 有一个参数的函数
- 有两个 or 多个参数的函数
- 有一个返回值的函数
- 有两个 or 多个返回值 (返回值用括号括起来) 的函数 返回值不需要的话 用匿名变量
_
接收
// func 定义函数
// func 函数名(参数1, 参数2, ...) {
// }
package main
import "fmt"
func main() {
// 调用 接受max的返回值 传递给函数所必须的参数
result := max(1,2)
// 接收到max函数返回值了
fmt.Println(result)
}
// 当有多个返回值, return的结果值命名和定义函数返回值的命名(可以不写变量名, 但是写了更清楚)无关
func max(num1 int, num2 int) int {
var result int
if num1 > num2 {
result = num1
} else {
result = num2
}
return result // return 返回值
// 有多个返回值, 若最后直接写 return 那么返回值按照定义的顺序返回~
}
func trans(len, wid float64) (float64, float64) { // 多个返回值, 个人认为这样可读性较高
area := len * wid
perimeter := (len + wid) * 2
fmt.Println("zc:",perimeter)
fmt.Println("area:",zrea)
return area, perimeter
}
可变参数(参数个数不确定), 需放在最后一个参数处 形式 : 参数名 ...数据类型
函数作用域
全局变量 & 局部变量 作用域 (都遵循就近原则, 前面的笔记有相关解释说明)
在 { } 里面声明, 生效的变量为临时变量 (小范围)
小作用域可以用到大作用域的信息, 反之不行
函数内定义的变量, 只能够在函数内部使用; 函数外部定义的变量, 可以理解为全局变量.
多定义一次性的变量 (如for循环中的 声明的计数变量 i 只在for循环里生效, for循环结束后,变量就用不了)
因为这样内存消耗少
递归函数
与普通函数一样 都是要有出口的(没有出口 递归函数就可能形成死循环 -> 栈溢出), 即满足xxx 条件 return 返回
递归函数 与普通函数相比特殊在于: 自己调用自己 直至满足 return 条件 然后返回结果 从栈一层层弹出来
package main
// 1+2+...+n
func getSum(n int) int {
if n == 1 {
return 1
}
return getSum(n-1) + n
}
示意图:
小案例练手: 斐波那契数列 (Fibonacci)
package main
import "fmt"
/*
实现斐波那契数列 (规律是从第三个数开始 为前两个数字之和)
1,1,2,3,5,8,13,21...
有多种方法实现, 这里采用的是递归的思想
*/
func main() {
fmt.Println("你想求第几个斐波那契数?")
var num int
fmt.Scan(&num)
for {
if num <= 0 {
fmt.Println("请输入一个正整数~")
fmt.Scan(&num)
} else {
break
}
}
fmt.Printf("第%d个斐波那契数为%d", num, Fibonacci(num))
}
func Fibonacci(num int) int {
if num == 1 || num == 2 { // or num<=2
return 1
} else {
return Fibonacci(num-1) + Fibonacci(num-2)
}
}
测试效果: