• Go语言基础之流程控制


    Go语言基础之流程控制

    流程控制是每种语言控制逻辑走向和执行顺序的重要部分.

    Go语言中最常用的流程控制有 iffor,而switchgoto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制.

    if else (分支结构)

    if条件判断基本语法

    Go语言中if条件判断的格式如下:

    package main
    
    import "fmt"
    
    func main()  {
    	var age = 18
    	if age == 18{
    		fmt.Println("春生成年人了 ")
    	}else if age < 18{  // 这个大括号的位置 不能变
    		fmt.Println("春生还没有成年")
    	}else { // 这个大括号的位置 不能变
    		fmt.Println("春生超过18了成为北京吴彦祖了。")
    	}
    
    }
    

    当表达式1的结果为true时,执行分支1,否则判断表达式2,如果满足则执行分支2,都不满足时,则执行分支3。 if判断中的else ifelse都是可选的,可以根据实际需要进行选择。

    Go语言规定与if匹配的左括号{必须与if和表达式放在同一行,{放在其他位置会触发编译错误。 同理,与else匹配的{也必须与else写在同一行,else也必须与上一个ifelse if右边的大括号在同一行。

    举个例子:

    func ifDemo1() {
    	score := 65
    	if score >= 90 {
    		fmt.Println("A")
    	} else if score > 75 {
    		fmt.Println("B")
    	} else {
    		fmt.Println("C")
    	}
    }
    

    if条件特殊写法

    if条件判断还有一种特殊写法,可以在if表达式之前添加一个执行语句,在根据变量值判断:·

    package main
    
    import "fmt"
    
    func main()  {
    	if age:=18; age == 18{  // 可以看到 我if表达式里面声明了一个 age 当前着age 只有if 代码块中存在 不会在函数的作用域中
    		fmt.Println("春生成年人了")
    	}else if age < 18{
    		fmt.Println("春生还没有成年")
    
    	}else {
    		fmt.Println("春生超过18了成为北京吴彦祖了。")
    	}
    }
    

    思考题: 上下两种写法的区别在哪里?

    for(循环结构)

    Go 语言中的所有循环类型均可以使用for关键字来完成。

    for 循环的基本格式如下:

    for 初始语句;条件表达式;结束语句{
        循环体语句
    }
    for i:=0;i < 10;i++{
      fmt.Println(i)
    }
    

    条件表达式返回条件表达式返回true时循环体不停地进行循环、直到条件表达式返回false时自动退出循环

    package main
    
    import "fmt"
    
    func ForDemo()  {
    	for i:=0;i < 10;i++{
    		fmt.Println(i)
    	}
    }
    
    func main()  {
    	ForDemo()
    
    }
    

    结果:

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Process finished with exit code 0
    

    for循环的初始语句可以被忽略,但是初始语句后的分号必须要写,例如:

    func forDemo2() {
    	i := 0
    	for ; i < 10; i++ {
    		fmt.Println(i)
    	}
    }
    

    for循环的初始语句和结束语句都可以省略,例如:

    func forDemo3() {
    	i := 0
    	for i < 10 {
    		fmt.Println(i)
    		i++
    	}
    }
    

    这种写法类似于其他编程语言中的while,在while后添加一个条件表达式,满足条件表达式时持续循环,否则结束循环。

    无限循环

    for {
        循环体语句
    }
    

    for循环可以通过breakgotoreturnpanic语句强制退出循环。

    for range (建值循环)

    Go语言中可以使用 for range 便利数组、切片、字符串、map及通道(channel).通过for range遍历的返回值

    有以下规律:

    1. 数据、切片、字符串返回值返回索引和值
    2. map返回键和值
    3. 通道(channel)只返回通道内的值

    代码:

    package main
    
    import "fmt"
    
    func ForDemo()  {
    	// for range 字符串
    	var s1 = "北京吴彦祖"
    
    	for i,v := range s1 { // rune 类型 utf-8
    		fmt.Println(i,v) // i: 是索引 v: 是值
    	}
    
    	var m = map[string]string{
    		"name":"春生",
    		"age":"18",
    	}
    	//  map
    	for k,v := range m{ // rune 类型 utf-8
    		fmt.Println(k,v)  // k :是建 "name" v:是值 "春生 "
    	}
    	// 数组 []string
    
    	var Array =  []int{1,2,3,4,5}
    
    	for i,v:= range Array{
    		fmt.Println(i,v) // i:是索引 v:是值
    	}
    
    }
    
    func main()  {
    	ForDemo()
    
    }
    
    

    结果:

    0 21271
    3 20140
    6 21556
    9 24422
    12 31062
    
    name 春生
    age 18
    
    0 1
    1 2
    2 3
    3 4
    4 5
    
    Process finished with exit code 0
    

    switch case

    使用 switch语句可方便的对大量的值进行条件判断.

    package main
    
    import "fmt"
    
    func SwitchDemo()  {
    	age := 18
    	switch age {
    	case 18:
    		fmt.Println("春生成年了")
    	case 19:
    		fmt.Println("春生比成年还打了一岁")
    	default:
    		fmt.Println("春生不管怎么样都是人")
    	}
    
    }
    
    func main()  {
    	SwitchDemo()
    
    }
    

    注意: Go语言规定每个 stitch 只能有一个 default 分支.

    一个分支可以有多个值,多个case值中间使用英文逗号分隔.

    package main
    
    import "fmt"
    
    func SwitchDemo()  {
    	switch n := 7; n {
    	case 1,3,5,7:
    		fmt.Println("奇数")
    	case 2,4,6,8:
    		fmt.Println("偶数")
    	}
    }
    
    func main()  {
    	SwitchDemo()
    
    }
    

    分支还可以使用表达式,这个时候switch语句后面不需要在跟判断变量.例如:

    package main
    
    import "fmt"
    
    func SwitchDemo()  {
    	var age = 30
    	switch {
    	case age < 25:
    		fmt.Println("好好学习天天向上")
    	case age > 25 && age >35:
    		fmt.Println("好好工作")
    	case age > 60:
    		fmt.Println("好好享受生活")
    	default:
    		fmt.Println("活着真好")
    
    	}
    
    }
    
    func main()  {
    	SwitchDemo()
    
    }
    

    fallthrough

    fallthrough语法可以执行满足条件下的case的下一个case,

    是为了兼容C语言中的case 设计

    package main
    
    import "fmt"
    
    func switchDemo()  {
    	var s = 1
    	switch  {
    	case s == 1:
    		fmt.Println(1)
    		fallthrough
    	case s == 2:
    		fmt.Println(2)
    	case s == 3:
    		fmt.Println(3)
    	case s == 4:
    		fmt.Println(4)
    	default:
    		fmt.Println("....")
    	}
    
    }
    
    
    func main()  {
    	switchDemo()
    
    }
    

    结果:

    1
    2
    
    Process finished with exit code 0
    

    可以看到 结果出现了1 和 2。明明 2 不满足结果 却出现了 这就是fallthrough 无条件的满足下一个 case

    goto (跳转指定标签)

    goto语句通过标签进行代码间的无条件跳转.

    goto语句可以在快速跳出循环、避免重复退出上有一定的帮助.

    Go语言中使用goto语句能简化一些代码的实现过程.

    例如双层嵌套for循环要推出时:

    package main
    
    import "fmt"
    
    func GotoDemo(){
    	var boolbreak = false
    	for i:=0;i<10;i++{
    		for j:=0;j<10;j++{
    			if j == 2{
    				boolbreak = true
    				break
    			}
    
    		fmt.Println(i,j)
    		}
    		if boolbreak {
    			break
    		}
    	}
    
    }
    
    func main()  {
    	GotoDemo()
    }
    
    

    使用goto语句能简化代码:

    func gotoDemo2() {
    	for i := 0; i < 10; i++ {
    		for j := 0; j < 10; j++ {
    			if j == 2 {
    				// 设置退出标签
    				goto breakTag
    			}
    			fmt.Printf("%v-%v
    ", i, j)
    		}
    	}
    	return
    	// 标签
    breakTag:
    	fmt.Println("结束for循环")
    }
    

    break (跳出循环)

    break 语句可以结束 forswitchselect 的代码块.

    break 语句还可在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的 for

    switchselect 的代码块上.举个例子:

    package main
    
    import "fmt"
    
    func GotoDemo(){
    BREAKDEMO1:
    	for i:=0;i<10;i++{
    		for j:=0;j<10;j++{
    			if j == 2{
    				break BREAKDEMO1
    			}
    		fmt.Println(i,j)
    		}
    
    	}
    
    }
    
    
    func main()  {
    	GotoDemo()
    }
    

    结果:

    0 0
    0 1
    
    Process finished with exit code 0
    

    可以看到 外层循环也退出了.

    continue (继续下次循环)

    continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 for循环内使用.

    continue 语句后添加标签时,表示开始标签对应的循环.例如:

    func continueDemo() {
    forloop1:
    	for i := 0; i < 5; i++ {
    		// forloop2:
    		for j := 0; j < 5; j++ {
    			if i == 2 && j == 2 {
    				continue forloop1
    			}
    			fmt.Printf("%v-%v
    ", i, j)
    		}
    	}
    }
    

    练习题

    1. 编写代码打印9*9乘法表
    package main
    
    import "fmt"
    
    func Demo(){
    
    	for i:=1;i<10;i++{
    		for j:=1;j<10;j++{
    			fmt.Printf("%d * %d = %d 	",i,j,i*j)
    		}
    		fmt.Println()
    
    	}
    
    }
    
    func main()  {
    	Demo()
    }
    

    结果:

    1 * 1 = 1       1 * 2 = 2       1 * 3 = 3       1 * 4 = 4       1 * 5 = 5       1 * 6 = 6       1 * 7 = 7       1 * 8 = 8       1 * 9 = 9       
    2 * 1 = 2       2 * 2 = 4       2 * 3 = 6       2 * 4 = 8       2 * 5 = 10      2 * 6 = 12      2 * 7 = 14      2 * 8 = 16      2 * 9 = 18      
    3 * 1 = 3       3 * 2 = 6       3 * 3 = 9       3 * 4 = 12      3 * 5 = 15      3 * 6 = 18      3 * 7 = 21      3 * 8 = 24      3 * 9 = 27      
    4 * 1 = 4       4 * 2 = 8       4 * 3 = 12      4 * 4 = 16      4 * 5 = 20      4 * 6 = 24      4 * 7 = 28      4 * 8 = 32      4 * 9 = 36      
    5 * 1 = 5       5 * 2 = 10      5 * 3 = 15      5 * 4 = 20      5 * 5 = 25      5 * 6 = 30      5 * 7 = 35      5 * 8 = 40      5 * 9 = 45      
    6 * 1 = 6       6 * 2 = 12      6 * 3 = 18      6 * 4 = 24      6 * 5 = 30      6 * 6 = 36      6 * 7 = 42      6 * 8 = 48      6 * 9 = 54      
    7 * 1 = 7       7 * 2 = 14      7 * 3 = 21      7 * 4 = 28      7 * 5 = 35      7 * 6 = 42      7 * 7 = 49      7 * 8 = 56      7 * 9 = 63      
    8 * 1 = 8       8 * 2 = 16      8 * 3 = 24      8 * 4 = 32      8 * 5 = 40      8 * 6 = 48      8 * 7 = 56      8 * 8 = 64      8 * 9 = 72      
    9 * 1 = 9       9 * 2 = 18      9 * 3 = 27      9 * 4 = 36      9 * 5 = 45      9 * 6 = 54      9 * 7 = 63      9 * 8 = 72      9 * 9 = 81      
    
    Process finished with exit code 0
    
  • 相关阅读:
    easyui的页面等待提示层,即mask
    easyui datebox 只选择年月
    java poi Excel导入 整数浮点数转换问题解决
    js去除日期字符串时分秒
    获得元素上的所有属性
    人月神话阅读笔记(二)
    人月神话读后感(一)
    独立冲刺阶段(四)
    独立冲刺阶段(三)
    独立冲刺阶段(二)
  • 原文地址:https://www.cnblogs.com/jiangchunsheng/p/14314020.html
Copyright © 2020-2023  润新知