1.函数及多返回值
package main

import "fmt"

// foo1 基本函数定义 func 函数名 (参数列表)(返回值列表,如果是1个参数时,可以去掉括号)
func foo1(a string, b int) int {
    fmt.Println("a = ", a)
    fmt.Println("b = ", b)

    c := 100
    return c
}

// foo2 返回多值的, 匿名的
func foo2(a string, b int) (int, int) {
    fmt.Println("a = ", a)
    fmt.Println("b = ", b)

    return 666, 777
}

// 返回多个返回值,有形参名称的
func foo3(a string, b int) (r1 int, r2 int) {
    fmt.Println("----- foo3 -----")
    fmt.Println("a = ", a)
    fmt.Println("b = ", b)

    // r1, r2 属于foo3的形参,初始化默认值是0
    // r1, r2 作用域空间 是foo3 整个函数的{}空间
    fmt.Println("r1和r2没有被复制时的默认值是")
    fmt.Println("r1 = ", r1)
    fmt.Println("r2 = ", r2)

    // 给有名称的返回值变量赋值
    r1 = 1000
    r2 = 2000

    return
}

// 返回多值函数,返回列表数据类型一致
func foo4(a string, b int) (r1, r2 int) {
    fmt.Println("----- foo4 -----")
    fmt.Println("a = ", a)
    fmt.Println("b = ", b)

    // 给有名称的返回值变量赋值
    r1 = 3000
    r2 = 4000

    return
}

// main
func main() {
    // 返回单值
    c := foo1("abc", 1)
    fmt.Println("c  = ", c)

    //返回多值,匿名的
    ret1, ret2 := foo2("foo2", 999)
    fmt.Println("ret1 = ", ret1, ", ret2 = ", ret2)

    //返回多值,有参数名
    ret1, ret2 = foo3("foo3", 1000)
    fmt.Println("ret1 = ", ret1, ", ret2 = ", ret2)

    //返回多值,有参数名
    ret1, ret2 = foo4("foo4", 3000)
    fmt.Println("ret1 = ", ret1, ", ret2 = ", ret2)

}
// 执行结果
a =  abc
b =  1
c  =  100
a =  foo2
b =  999
ret1 =  666 , ret2 =  777
----- foo3 -----
a =  foo3
b =  1000
r1和r2没有被复制时的默认值是
r1 =  0
r2 =  0
ret1 =  1000 , ret2 =  2000
----- foo4 -----
a =  foo4
b =  3000
ret1 =  3000 , ret2 =  4000