zoukankan      html  css  js  c++  java
  • Go语言基础之内置函数

    Go语言基础之内置函数

    一、内置函数

    内置函数 介绍
    close 主要用来关闭channel
    len 用来求长度,比如string、array、slice、map、channel
    new 用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针
    make 用来分配内存,主要用来分配引用类型,比如chan、map、slice
    append 用来追加元素到数组、slice中
    panic和recover 用来做错误处理

    二、panic/recover

    Go语言中目前(Go1.12)是没有异常机制,但是使用panic/recover模式来处理错误。 panic可以在任何地方引发,但recover只有在defer调用的函数中有效。 首先来看一个例子:

    func funcA() {
        fmt.Println("func A")
    }
    
    func funcB() {
        panic("panic in B")
    }
    
    func funcC() {
        fmt.Println("func C")
    }
    func main() {
        funcA()
        funcB()
        funcC()
    }
    

    输出:

    func A
    panic: panic in B
    
    goroutine 1 [running]:
    main.funcB(...)
            .../code/func/main.go:12
    main.main()
            .../code/func/main.go:20 +0x98
    

    程序运行期间funcB中引发了panic导致程序崩溃,异常退出了。这个时候我们就可以通过recover将程序恢复回来,继续往后执行。

    func funcA() {
        fmt.Println("func A")
    }
    
    func funcB() {
        defer func() {
            err := recover()
            //如果程序出出现了panic错误,可以通过recover恢复过来
            if err != nil {
                fmt.Println("recover in B")
            }
        }()
        panic("panic in B")
    }
    
    func funcC() {
        fmt.Println("func C")
    }
    func main() {
        funcA()
        funcB()
        funcC()
    }
    

    注意:

    1. recover()必须搭配defer使用。
    2. defer一定要在可能引发panic的语句之前定义。

    分金币

    /*
    你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth。
    分配规则如下:
    a. 名字中每包含1个'e'或'E'分1枚金币
    b. 名字中每包含1个'i'或'I'分2枚金币
    c. 名字中每包含1个'o'或'O'分3枚金币
    d: 名字中每包含1个'u'或'U'分4枚金币
    写一个程序,计算每个用户分到多少金币,以及最后剩余多少金币?
    程序结构如下,请实现 ‘dispatchCoin’ 函数
    */
    var (
        coins = 50
        users = []string{
            "Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
        }
        distribution = make(map[string]int, len(users))
    )
    
    func main() {
        left := dispatchCoin()
        fmt.Println("剩下:", left)
    }
    
    
    package main
    
    import "fmt"
    
    var (
        coins = 50
        users = []string{
            "Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
        }
        distribution = make(map[string]int, len(users))
    )
    
    func dispatchCoin() int {
        for _, name := range users {
            for _, c := range name {
                switch c {
                case 'e', 'E':
                    distribution[name]++
                    coins--
                case 'i', 'I':
                    distribution[name] += 2
                    coins -= 2
                case 'o', 'O':
                    distribution[name] += 3
                    coins -= 3
                case 'u', 'U':
                    distribution[name] += 4
                    coins -= 4
                }
            }
        }
        return coins
    }
    func main() {
        left := dispatchCoin()
        fmt.Println("剩下:", left)
        fmt.Println(distribution)
    
    }
    

    三、总结

    异常处理

    //以后的异常处理就是 拿到你要捕获异常的前面
    defer func() {
    	if error := recover(); error != nil {
    		fmt.Println(error)  //如果有异常就执行
    	}
    	fmt.Println("这是finally的内容,不管程序是否出错,都会执行") //finally执行的东西
    }()
    
  • 相关阅读:
    页面布局方案-上固定,下自适应
    页面布局方案-左右固定,中间自适应
    身心疲惫
    生产计划拆分说明-班组绩效匹配算法
    CSS代码片段
    常见内部函数----Python
    pyramid的第一个项目
    2015年大连国际马拉松半程经历
    高效时间管理
    《番茄工作法图解》第四章读书笔记
  • 原文地址:https://www.cnblogs.com/randysun/p/15415600.html
Copyright © 2011-2022 走看看