go:函数

1.声明语法
        func 函数名 (参数列表) (返回值) {
                pass
        }
        1.func add() {
                pass
        }
        2.func add(a int, b int) (int,int) {
                pass
        }
        3.func add(a,b int,args...) int {
                pass
        }
     4.匿名函数

func() {       fmt.Printf("func 1\n")       }()       func(x int) {       fmt.Printf("func 2, x is %d\n", x)       }(2)       a := func(a,b int) int {        return a+b       }(10,20)
     5.函数可以作为变量赋值/作为参数传入
                1)作为变量赋值
                func add(a,b int) int {
                        return a + b
                }
                func main() {
                        c := add
                        sum := c(10,20)
                        fmt.Println(sum) // 30
                }
                2)作为参数传入
                type add_func func(int , int) int //定义一种类型。add_func类型 参数两个int变量返回值为int
                func add(a,b int) int {
                        return a + b
                }
                func operate(op add_func,a int, b int ) int {
                        return op(a+b)
                }
                func main(){
                        c := add
                        sum := operate(c,100,200)
                        fmt.Println(sum) //300
                }
2.参数传递方式
        1)值传递
        2)引用传递 //值所在内存的地址
        注意:
                无论是值传递还是引用传递,传递给函数的都是变量的副本(也就是深copy一份传递过去)。不过,值传递是值的拷贝,引用传递是地址的拷贝。
                map、slice、chan、指针、interface默认为引用的方式传递
3.命名返回值的名字:
        package main

        import "fmt"

        func calc(a, b int) (sum int, sub int) {
                sum = a + b
                sub = a - b
                return
        }
        func main() {
                _, sum := calc(100, 200)
                fmt.Println("sum=", sum)
        }
4.defer用途
        1)当函数返回时,执行defer语句。
        2)多个defer语句,按先进后出执行(实际是将defer语句的参数和资源压栈,函数结束时根据出栈顺序执行)
        3)defer语句的变量,在defer声明时就决定了
                package main

                import "fmt"

                func main() {
                        i := 0
                        defer fmt.Println(i) //0
                        i = 10
                        fmt.Println(i) //10
                        /*
                                10
                                0
                        */
                }