美文网首页
Golang——流程控制

Golang——流程控制

作者: Cici冬雪 | 来源:发表于2020-05-14 07:31 被阅读0次

    常用ifforswitchgoto属于扩展的

    注意:Go 没有三目运算符,所以不支持 ...?...:...形式的条件判断。

    1.条件语句 if else

    func main() {
        a := 1
        if a < 0 { 
            fmt.Println("小于0")
        } else if a == 0 {
            fmt.Println("等于0")
        } else {
            fmt.Println("大于0")
        }
    }
    

    注意:
    1.不需要使用括号()将条件包含起来;
    2.无论语句体内有几条语句,花括号{}都是必须存在的;
    3.左花括号{必须与if或者else在同一行;
    4.在if之后,条件语句之前,可以添加变量初始化语句,使用;间隔;
    5.在有返回值的函数中,不允许将“最终的”return 语句包含在if... else ...结构中,否则编译报错。

    if判断特殊写法
    在if之后,条件语句之前,可以添加变量初始化语句,使用;间隔

    func main() {
        if a := 1; a < 0 { 
            fmt.Println("小于0")
        } else if a == 0 {
            fmt.Println("等于0")
        } else {
            fmt.Println("大于0")
        }
    }
    

    2.选择语句

    switch case

    func main() {
        a := 1
    
        switch a {
            case 0: fmt.Println("0")
            case 1: fmt.Println("1")
            default: fmt.Println("other")
        }
    
        a := 3
        switch a {
            case 0: 
                fmt.Println("0")
            case 1: 
                fmt.Println("1")
            default: 
                fmt.Println("other")
        }
    }
    

    注意:
    1.左花括号{必须与switch在同一行;
    2.条件表达式不限制为常量或者整数;
    3.单个case中,可出现多个结果选项;
    4.Go语言不需要break来明确跳出一个case;
    5.只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case
    6.可以不设定switch之后的条件表达式,此时与if... else ...逻辑左右等。

    func main() {
        switch a := 1; a {
            case 0, 2:
                fmt.Println("0或者2")
            case 1, 3:
                fmt.Println("1或者3")
            default:
                fmt.Println("other")
        }
    }
    
    func main() {
        a := 1
        switch {
            case a > 1:
                fmt.Println("大于1")
            case a == 1:
                fmt.Println("等于1")
            default:
                fmt.Println("小于")
        }
    }
    

    fallthrough 可以无条件的执行下一个case,为了兼容C语言而设计,已经是deprecated。

    func main() {
        a := 1
        switch {
            case a > 1:
                fmt.Println("大于1")
            case a == 1:
                fmt.Println("等于1")
                fallthrough
            case a == 0:
                fmt.Println("等于0")
            default:
                fmt.Println("小于0")
        }
    }
    // 等于1
    // 等于0
    

    select

    用于通道类型

    select {
        case communication clause  :
           statement(s);      
        case communication clause  :
           statement(s);
        /* 你可以定义任意数量的 case */
        default : /* 可选 */
           statement(s);
    }
    

    3.循环语句

    只支持for,不支持while、do-while等。

    for

    for 初始化语句; 条件表达式; 结束语句 {
        循环体语句
    }
    

    注意:
    1.左花括号{必须与for在同一行;
    2.可以在循环条件中的定义和初始化变量,但是,不支持以逗号为间隔的多个赋值语句;
    3.使用 breakcontinue可控制循环;

    func main() {
        array := []byte{1, 2, 3}
        for i := 0; i < len(array); i++ {
            fmt.Println(array[i])
        }
    
        //初始语句可以被忽略,但是分号需要保留
        i := 0
        for ; i < len(array); i++ {
            fmt.Println(array[i])
        }
    
        //初始语句和结束语句都可以省略
        //此写法类似其它编程语言中的while
        j := 0
        for j < len(array){
            fmt.Println(array[j])
            j++
        }
        
        //无限循环
        for {
            //通过break、goto、return、panic语句强制退出循环
        }
    }
    

    break(跳出循环),可以结束forswitchselect的代码块。
    break也可以添加标签,表示退出代码块,必修定义在对应的forswitchselect的代码块上。尽量少用。

    func main() { 
        BREAKTAG:
            for i := 0; i < 5; i++ {
                for j := 0; j < 5; j++{
                    if j == 3 {
                        // break //跳出当前for循环
                        // continue //继续下一次循环
                        break BREAKTAG
                    }
                    fmt.Printf("%d-%d\n",i, j)
                }
            }
    
        fmt.Printf("break跳出")
    }
    

    continue(继续下次循环)
    只用在 for循环中。
    continue也可以加标签,尽量少用。

    for range(键值循环)

    可遍历数组、切片、字符串、map以及channel
    1.数组、切片、字符串返回索引和值;
    2.map返回键和值;
    3.channel只返回通道内的值;

    func main() {
        str := "Hello"
        for k,v := range str {
            fmt.Printf("%d-%c\n", k, v)
        }
    }
    

    中英文混杂的字符串,需要用for range循环

    4.跳转语句

    goto,尽量少用

    func main() { 
        for i := 0; i < 5; i++ {
            for j := 0; j < 5; j++{
                if j == 3 {
                    // break //跳出当前for循环
                    // continue //继续下一次循环
                    goto gotoTag
                }
                fmt.Printf("%d-%d\n",i, j)
            }
        }
    
        gotoTag:
            fmt.Printf("goto跳出")
    }
    

    练习题

    99乘法表

        for i := 1; i < 10; i++ {
            for j := 1; j <= i; j++ {
                fmt.Printf("%d * %d = %d  ", j, i, i * j)
            }
            fmt.Print("\n")
        }
    

    水仙花数

    水仙花数是指一个3位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)

    package main
    
    import (
        "fmt"
        "math"
    )
    
    func main(){
        fmt.Println("11")
        fmt.Println(math.Pi)
        for i := 100; i < 1000; i++ {
            //百位
            a := i/100
    //      fmt.Println(a)
            //十位
            b := i%100/10
    //      fmt.Println(b)
            //个位
            c := i%100%10
    //      fmt.Println(c)
            sum := math.Pow(float64(a), 3) + math.Pow(float64(b), 3) + math.Pow(float64(c), 3)
    //      fmt.Println(sum)
            if int(sum) == i {
                fmt.Printf("%d^3+%d^3+%d^3=%d\n", a, b, c, int(sum))
            }
        }
    }
    

    200~1000以内的素数

    package main
    
    import (
        "fmt"
    )
    
    //质数(素数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数
    func isSushu(x int)bool{
        for i := 2; i < x; i++ {
            if x%i == 0 {
                return false
            }
        }
        return true
    }
    
    func main(){
        for i := 200; i < 1000; i++ {
            // 用函数
            // if isSushu(i) {
            //  fmt.Println(i)
            // }
            //不用函数
            isSushuFlag := true
            for j := 2; j < i; j++ {
                if i%j == 0 {
                    isSushuFlag = false
                    break
                } 
            }
            if isSushuFlag {
                fmt.Println(i)
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Golang——流程控制

          本文链接:https://www.haomeiwen.com/subject/aalznhtx.html