Go 函数基础

22 阅读2分钟

函数: 一段代码的集合

面向对象里才有方法

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)
	}
}

测试效果: