• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

28_Go基础(函数)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
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

}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[golang][history]TheGoAnnotatedSpecification\Go注释规范266b9d49bfa3d2d16b4111378 ...发布时间:2022-07-10
下一篇:
go语言连接本地数据库发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap