zoukankan      html  css  js  c++  java
  • 28_Go基础(函数)

    package main
    
    import (
        "errors"
        "fmt"
    )
    
    // 1. 无返回值的函数
    func f1() {
        fmt.Println("Hello World!")
    }
    
    // 2. 有返回值;多个形参类型一致,可简写
    func f2(x, y int) int {
        return x + y
    }
    
    // 3. 可变参数 固定参数搭配可变参数使用时,可变参数要放在固定参数的后面
    func f3(x string, y ...int) {
        s := 0
        for _, v := range y {
            s += v
        }
        fmt.Println(x, y, s) // hello [1 2 3] 6
    }
    
    // 4. 多返回值 返回值指定了 sum、sub, return 后可不跟返回值
    func f4(x, y int) (sum, sub int) {
        sum = x + y
        sub = x - y
        fmt.Println(sum, sub)
        return
    }
    
    // 5. 函数类型与变量
    type calc func(int, int) int // 定义一个函数类型 calc
    
    func f5(x, y int) int {
        return x + y
    }
    func f6(x, y int) int {
        return x - y
    }
    
    // 6. 函数作为参数
    func f7(x, y int, op func(int, int) int) int {
        return op(x, y)
    }
    
    // 7. 函数作为返回值
    func f8(s string) (func(int, int) int, error) {
        switch s {
        case "+":
            return f5, nil
        case "-":
            return f6, nil
        default:
            err := errors.New("无法识别的操作符!")
            return nil, err
        }
    }
    
    // 8. 匿名函数
    func f9() {
        // 匿名函数保存到变量里
        add := func(x, y int) {
            fmt.Println(x + y)
        }
        add(20, 20)
    
        // 立即执行函数
        func(x, y int) {
            fmt.Println(x + y)
        }(20, 20)
    }
    
    // 9. 闭包
    func f10(base int) (func(int) int, func(int) int) {
        add := func(i int) int {
            base += i
            return base
        }
    
        sub := func(i int) int {
            base -= i
            return base
        }
        return add, sub
    }
    
    // 10. defer
    func f13() {
        fmt.Println("start")
        defer fmt.Println(1)
        defer fmt.Println(2)
        defer fmt.Println(3)
        fmt.Println("end")
    
        // start
        // end
        // 3
        // 2
        // 1
    }
    
    // 11 panic/recover
    func funcA() {
        fmt.Println("func A")
    }
    
    func funcB() {
        defer func() {
            err := recover()
            // 如果程序出出现了panic错误,可以通过recover恢复过来
            if err != nil {
                fmt.Println("recover in B")
            }
        }()
        fmt.Println(123)
        panic("panic in B")
    }
    
    func funcC() {
        fmt.Println("func C")
    }
    
    func main() {
        f1()
    
        f2(1, 2)
    
        f3("hello", 1, 2, 3)
    
        f4(3, 2)
    
        var c calc
        c = f5
        fmt.Printf("Type of c: %T\n", c) // Type of c: main.calc
        fmt.Println(c(1, 2))
        c1 := f5
        fmt.Printf("Type of c: %T\n", c1) // Type of c: func(int, int) int
        fmt.Println(c1(1, 2))
    
        fmt.Println(f7(1, 2, f5))
    
        c2, _ := f8("+")
        fmt.Println(c2(20, 10))
    
        f9()
    
        f11, f12 := f10(10)
        fmt.Println(f11(1), f12(2)) //11 9
        fmt.Println(f11(3), f12(4)) //12 8
        fmt.Println(f11(5), f12(6)) //13 7
    
        f13()
    
        funcA()
        funcB()
        funcC()
        // func A
        // 123
        // recover in B
        // func C
    
    }
  • 相关阅读:
    Linux免密码登陆
    Java事务的概念
    SpringMVC访问静态资源
    堆排序
    滚动视图 UIScrollView
    HTML数据解析
    同步下载 异步下载
    项目中的小心得(以后慢慢积累起来)
    xcode 中 UIbutton图片的放置
    NSobject的基本方法使用
  • 原文地址:https://www.cnblogs.com/luwei0915/p/15497773.html
Copyright © 2011-2022 走看看