第9节 Go中流程控制

160 阅读2分钟

Go语言中我必须掌握三大流程控制语句

  • 顺序控制
  • 分支控制
  • 循环控制

1. 顺序控制

简单理解就是按代码编写的顺序逐行执行,程序代码中没有任何的判断和跳转

2. 分子控制

2.1 单分支控制

if 条件表达式 {
    逻辑代码块
}

掘金-第 8 页.drawio (2).png

package main

import "fmt"

func main() {
    var age int = 20
    if(age > 18) {
	fmt.Println("你已是成年人了!")
    }
}
  • golang 中支持在if表达式中直接定义变量
// 此时 if 后的条件表达式是不能加 () 的,否则编译报错
if age := 20; age > 18 {
    fmt.Println("你已是成年人了!")
}


func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	}
	return lim
}

2.2 双分支控制

if 条件表达式 {
    逻辑代码块1
} else {
    逻辑代码块2
}

掘金-第 8 页.drawio (3).png

2.3 使用细节

  • if else 必须有大括号 {},不然编译报错
func main() {
    var age int = 20
    // 编译报错:syntax error: unexpected newline, expecting { after if clause
    if(age > 18) 
	fmt.Println("你已是成年人了!")
    else 
        fmt.Println("你还小!")
}
  • if else 中的 else 不能换行,不然编译报错
func main() {
    var age int = 20
    if(age > 18) {
        fmt.Println("你已是成年人了!")
    }	
    // syntax error: unexpected else, expecting } 
    else {
        fmt.Println("你还小!")
    }	 
}

2.4 switch分支

  • java 中不同的就是 case 后面不需要加 break关键字
  • switch 的穿透 fallthrought ,如果在 case 语句块后面加 fallthrough,则会继续执行下一个case
package main

import "fmt"

func main() {
    var a int = 10
    switch a {
	case 10 : 
            fmt.Println(10)
            fallthrough
	case 20 : 
            fmt.Println(20)
	case 30 :
            fmt.Println(40)	
	default :
            fmt.Println("no match")	
    }		
}

image.png

  • Type Switch
    switch 语句还可以被用 Type Switch 来判断某个 interface 变量中实际指向的变量类型
package main

import "fmt"

func main() {
	var x interface{}
	var y = 10.0
	x = y

	switch i := x.(type) {
	case nil :
		fmt.Printf("x 的类型:%T\n",i)
	case int :
		fmt.Printf("x 是int类型\n")
	case float64 :
		fmt.Printf("x 是float64类型\n")
	default : 
		fmt.Printf("未知类型\n")			
	}
}

image.png

3. 循环控制

3.1 for 循环

golang 中 for 的几种写法,和 Java 中有所不同,for 后面的循环条件不需要加 ()

  • 形式一
package main

import "fmt"

func main() {
	for j := 1; j <= 10; j++ {
		fmt.Printf("j=%v\n", j)
	}
}
  • 形式二
package main

import "fmt"

func main() {
	j := 1
	for j <= 10 {
		fmt.Printf("j=%v\n", j)
		j++
	}
}
  • golang 提供 for-range的方式,方便遍历字符串和数组
package main

import "fmt"

func main() {
	var str string = "Beijing 欢迎你"
        // 注意:这里如果你不想要 index 的值,则可以 for _,val := range str{}
	for index, val := range str {
		fmt.Printf("index=%v, value=%c\n",index, val)
	}
}

注意:对于字符串的变量不推荐使用传统的下标方式来遍历,因为遇到中文字符串时会乱码。因为下标的遍历方式是按照字节来遍历的,而一个汉字对应3个字节,把带有汉字的字符串转换成切片,然后遍历。

package main

import "fmt"

func main() {
	var str string = "Beijing 欢迎你"
        
	str2 := []rune(str)
	for i := 0; i < len(str2); i++ {
		fmt.Printf("i=%v, value=%c\n",i, str2[i])
	}
}

3.2 whiledo ... while 循环

在golang语言中没有 这两种语法 !!!需要特别注意。但是可以通过 for 循环来实现它们的循环效果

  • for循环实现 while 循环的功能
package main

import "fmt"

func main() {

	var i int = 1
	for {
		// 循环结束条件
		if(i > 3) {
                    break 
		}
		fmt.Printf("i=%v\n",i)
		i++
	}
}

image.png

  • for循环实现 do ... while 循环的功能
package main

import "fmt"

func main() {
	var j int = 1
	for {
		fmt.Printf("j=%v\n",j)
		j++
		
		// 循环结束条件
		if(j > 3) {
                    break
		}
	}
}

4. continuebreakreturn

这三个关键字的使用和Java语言一样

  • continue:跳过本次循环,继续执行下一次循环
  • break:跳出当前循环,继续执行当前循环以外的逻辑代码
  • return :使用在方法或者函数中,表示跳出所在的方法或者函数(也就是方法或函数的逻辑结束)