• golang之流程控制(注意点)


    Go在流程控制方面特点如下:

    • 没有do和while循环,只有一个广义的for语句
    • switch语句灵活多变,还可以用于类型判断
    • if语句和switch语句都可以包含一条初始化子语句
    • break语句和continue语句可以跟一条label标签语句,用于标识需要终止或继续的代码块
    • defer语句可以使我们更加方便地执行异常捕获和资源回收任务
    • select语句也可以用于多分支选择,但只与通道配合使用
    • go语句用于异步启动goroutine并执行指定函数

    for range 注意点:

    • 对数组、切片或者字符串值进行迭代,:=左边只有一个迭代变量时,要注意只能得到元素的索引,而不是元素。
    • 迭代没有任何元素的数组值、为nil的切片值、为nil的字典值、为“”的字符串值,不会执行for语句中的代码。for在一开始就会结束。因为这些值长度是0
    • 迭代为nil的通道值会让当前流程永远阻塞在for语句上。

    defer 控制语句

    package main
    
    import (
        "fmt"
    )
    
    //outerFunc是外围函数
    //defer执行顺序是,先进后出,延迟调用指定的函数
    //当外围函数中语句执行完毕时,只有延迟函数都执行完毕,外围函数才真的结束
    //当执行外媒函数中的return时,只有延迟函数都执行完毕,外围函数才返回
    //当外围函数中的代码引发运行错误时,只有延迟函数执行完毕,运行时的错误才会被扩散至调用函数。
    
    //因此defer常用在执行释放资源或异常处理等收尾任务
    //defer语句在外围函数体中位置不限,数量不限
    
    func printNumbers() {
        for i := 0; i < 5; i++ {
            //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210
            defer func() {
                fmt.Printf("%d", i)
            }()
        }
    }
    
    func printNumbers1() {
        for i := 0; i < 5; i++ {
            //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210
            defer func(n int) {
                fmt.Printf("%d", n)
            }(i)
        }
    }
    func printNumbers2() {
        for i := 0; i < 5; i++ {
            //defer被压进一个栈,函数完毕前一刻,先进后出,所以是43210
            defer func(n int) {
                fmt.Printf("%d", n)
            }(i * 2)
        }
    }
    
    func main() {
        printNumbers()
        fmt.Println()
        printNumbers1()
        fmt.Println()
        printNumbers2()
    }
  • 相关阅读:
    [转] Java中的static关键字解析
    [转] Java中public,private,final,static等概念的解读
    [转] Java关键字final、static使用总结
    Android Studio代码调试大全
    [转] Java接口_interface_implements
    中介者模式
    责任链模式
    命令模式
    桥接模式
    单例模式
  • 原文地址:https://www.cnblogs.com/pyyu/p/8193694.html
Copyright © 2020-2023  润新知