return基本语法

func 函数名 (形参列表) (返回值类型列表){
    语句...
    return返回值列表
}

注:
golang函数支持返回多个值
1,如果返回多个值时,在接收时,希望忽略某个返回值,使用_符号表示占位忽略
2,如果返回值只有一个,返回值类型列表,可以不写()

代码示例:

package main
import "fmt"

func test(n1 int) {
    n1 = n1 + 1
    fmt.Println("test() n1=",n1)
}

func getSum(n1 int, n2 int) int {
    sum := n1 + n2
    fmt.Println("getSum sum=",sum)
    return sum
}

func getSumAndSub(n1 int, n2 int)(int,int) {
    sum := n1 + n2
    sub := n1 - n2
    return sum, sub
}

func main(){
    n1 := 10
//调用test
    test(n1)
    fmt.Println("main() n1=",n1)

    sum := getSum(10, 20)
    fmt.Println("main sum n1=",sum)
//调用getSumAndSub

    res1, res2 := getSumAndSub(1,2)
    fmt.Printf("res1=%v res2=%v\n", res1, res2)

//忽略某个返回值,使用 "_"符号表示点位忽略
    _, res3 := getSumAndSub(1,2)
    fmt.Printf("res3=%v\n",  res3)
}

image.png

函数的递归调用
基本介绍
程序在运行的过程中调用自己,被称这递归

代码示例:

package main

import "fmt"

func test(n int ){
    if n > 3 {
        n--
        test(n)
    }
    fmt.Println("n=",n)
}

func main(){
    test(5)
}

代码分析:
1,分配main空间,test=5
2,分配test空间,此时num(5)--,就是5-1 = 4
3,分配test空间,此时num(4)--,就是4-1= 3
4,分配test空间,此时num = 3, 3不大于3,直接执行fmt语句,输出结果为3,并销毁第4步test空间
5,第3步test 空间num=3,执行fmt语句,输出结果为3,并销毁第3步test空间
6,第2步test空间num=4,执行fmt语句,输出结果为4,并销毁第2步test空间
7,销毁第1步main空间

输出的结果为:
num=3
num=3
num=4
查看结果:
image.png

代码2:

package main
import "fmt"

func test2(num int ){
    if num > 3 {
        num--
        test2(num)
    }else{
        fmt.Println("num=",num)
    }
}

func main(){
    test2(5)

}

代码分析:
1,分配main空间,test2=5
2,分配test2空间,此时num(5)--,就是5-1 = 4
3,分配test2空间,此时num(4)--,就是4-1= 3
4,分配test2空间,此时num = 3, 3不大于3,不会运行到if语句中,运行else语句中的fmt语句,输出3,并销毁自己的空间
5,进入第3步test2空间的if,不执行else,并销毁自己的空间
6,进入第2步test2空间的if,不执行else,并销毁自己的空间
7,销毁第1步main空间

输出的结果为:
num=3
结果检查:
image.png

递归函数注意事项
1)执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
2)函数的局部变量是独立的,不会相互影响
3)递归必须向退出栈归的条件逼近,否者就是无限递归
4)当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁