第六课 go语言基础-流程控制语句

第六课 go语言基础-流程控制语句

tags:

  • golang
  • 2019尚硅谷

categories:

  • golang
  • 流程控制语句
  • if
  • switch
  • for

第一节 go语言流程控制介绍

在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。
golang 中没有while和do…while的语法。可以用if和for模拟。

  1. 顺序控制 (没有循环和跳转,比较简单)
  2. 分支控制
  3. 循环控制

第二节 go语言 if 分支控制

让程序有选择的的执行分支控制有三种:

  1. 单分支
  2. 双分支
  3. 多分支

1. 单分支if语句

基本语法: 不需要()

if 条件表达式 {
	执行代码块
}

**注意:**当条件表达式为true时,就会执行{}的代码。注意{}是必须有的,就算你只写一行代码

package main
import "fmt"


func main() {
	//编写一个程序,可以输入人的年球,如果该同志的年龄大于18岁,则输出”你年龄大
	//于18,要对自己的行为负责!”	
	var age int
	fmt.Println("输入您的年龄")
	fmt.Scanln(&age)
	// 这里不需要()
	if age > 18 {
		fmt.Println("你年龄大于18,要对自己的行为负责!")
	}
}

golang 支持在if中直接定义变量 如下:

package main
import "fmt"


func main() {
	// golang 支持在if中直接定义变量 如下:
	if age := 20; age > 18 {
		fmt.Println("你年龄大于18,要对自己的行为负责!")
	}
}

2. 双分支if 语句

基本语法

if条件表达式{
	执行代码块1
}else {
	执行代码块2
}

注意:当条件表达式成立,即执行代码块1,否则执行代码块2。{} 也是必须有的。

3. 多分支if 语句

基本语法

if 条件表达式1 {
	执行代码块1
}else if条件表达式2 { 
	执行代码块2
}
....
else {
	执行代码块n
}

注意: 最后的else,可以有也可以没有。只会执行一个if分支。

package main
import "fmt"


func main() {
	// 使用陷阱 这里只会进到一个if中
	var age int
	fmt.Println("输入您的年龄")
	fmt.Scanln(&age)
	if age > 18 {
		fmt.Println("ok1")
	} else if age > 9 {
		fmt.Println("ok2")
	} else if age > 4 {
		fmt.Println("ok3")
	}
}

4. 嵌套分支if 语句

在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。(不宜过多,最多不要超三层)
基本语法

if 条件表达式 {
    if 条件表达式 {
    	执行代码块
    } else {
		执行代码块
    }
}

第三节 go语言 switch 分支结构

  1. switch语句用于基于不同条件执行不同动作,每一个case分支都是唯一的,从上到下逐一测试, 直到匹配为止。
  2. 匹配项后面也不需要再加break(golang默认给加了break, 不用自己写了)
    基本语法
switch表达式{
    case表达式1,表达式2, ... :
        语句块1
    case表达式3,表达式4, ... :
        语句块2
    //这里可以有多个case语句
    default:
    语句块
}
  1. 注意事项
    • case后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
    • case后 的各个表达式的值的数据类型,必须和switch 的表达式数据类型一致
    • case后 面可以带多个表达式,使用逗号间隔。比如case表达式1,表达式2…
    • case后 面的表达式如果是常量值(字面量),则要求不能重复
    • case后 面不需要带break ,程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个都匹配不到,则执行default
    • default 语句不是必须的
    • switch 后也可以不带表达式,类似lif-else分支来使用
    • switch 后也可以直接声明定义一个变量,分号结束,不推荐
    • switch 穿透fallthrough,如果在case语句块后增加allthrough ,则会继续执行下一个case,也叫switch穿透
    • Type Switch: switch 语句还可以被用于type-switch来判断某个interface
      (接口)变量中实际指向的变量类型
package main
import "fmt"


func main() {
	var age int = 20
	// switch 不加表达式 当作if-else使用
	switch {
		case age == 10:
			fmt.Println("age的值为10")
		case age >= 20:
			fmt.Println("age的值为20以上")
		default:
			fmt.Println("默认")
	}

	// switch 后也可以直接声明定义一个变量,分号结束,不推荐
	switch score := 80; {
	case score < 60:
		fmt.Println("不合格")
	case score > 60 && score <=80:
		fmt.Println("合格")
	default:
		fmt.Println("优秀")
	}

	// fallthrough switch穿透
	var num int = 20
	switch num{
		case 20:
			fmt.Println("num的值为20")
			fallthrough //默认只能穿透一层 输出为num的值为20 num的值为30
		case 30:
			fmt.Println("num的值为30")
		default:
			fmt.Println("默认")
	}
	
	//switch 语句还可以被用于type-switch来判断某个interface(接口)变量中实际指向的变量类型
	var x interface{}
	var y = 10.0
	x = y
	switch i := x.(type) {
	case nil:
		fmt.Printf(" x的类型~ :%T" ,i)
	case int:
		fmt. Printf("x是int型")
	case float64:
		fmt. Printf("x是float64型" )
	case func(int) float64:
		fmt.Printf("x是func(int) 型")
	case bool, string:
		fmt.Printf("x是bool或string 型")
	default:
		fmt.Printf("未知型")
	}
}

第四节 go语言for循环

听其名而知其意,就是让代码可以循环的执行。
基本语法如下:

for 循环变量初始化; 循环条件; 循环变量迭代{
		循环操作(语句)
}

使用细节和注意事项:

  1. 循环条件是返回一个布尔值的表达式
  2. for循环的第二种使用方式 :将变量初始化和变量迭代写到其它位置
for 循环判断条件{
	//循环执行语句
}
  1. for循环的第三种使用方式:上面的写法等价for;;{} 是一个无限循环,通常需要配合break语句使用。
for {
    //循环执行语句
}
  1. Golang提供for-range的方式,可以方便遍历字符串和数组。
  2. 如果我们的字符串含有中文,那么传统的遍历字符串方式,就是错误,会出现乱码。*for-range方式不会出错。比较智能以字符方式遍历。注意观察index,遇到中文加 3.
  3. 原因是传统的对字符串的遍历是按照字节来遍历而一个汉字在utf-8编码是对应3个字节
  4. 传统方式可以用切片解决。str2 := []rune(str) //就是把str转成[]rune
package main
import "fmt"


func main() {
	for i := 1; i <= 10; i++{
		fmt.Println("for 循环的基础用法", i)
	}

	// for循环第二种使用方式
	j := 1 // 循环变量的初始化
	for j < 10 { // 循环条件
		fmt.Println("for 循环的第二种使用方法", j)
		j++ //循环变量迭代
	}

	// for 循环第三种使用方法
	k := 1
	for{
		fmt.Println("for 循环的第三种使用方法")
		k++
		if k > 3 {
			break
		}			
	}

	// for-range 方便遍历字符串或者数组
	var str string = "hello for 使用"
	
	// 传统方式 需要用切片解决中文问题
	str2 := []rune(str) //就是把str转成[]rune
	for i := 0; i < len(str2); i++ {
		fmt.Printf("%c", str2[i])
	}

	// for-range方式遍历 比较智能。注意观察index。以字符方式遍历
	for index, val := range str{
		//如果我们的字符串含有中文,
		//那么传统的遍历字符串方式,就是错误,会出现乱码。
		//原因是传统的对字符串的遍历是按照字节来遍历。
		//for-range方式不会出错
		fmt.Printf("index=%d,value=%c \n", index, val)
	}
}

第五节 流程跳转语句

1. break

break语句用于终止某个语句块的执行,用于中断当前for循环或跳出switch 语句。
break的引出:
随机生成1-100的一个数,直到生成了99这个数,看看你一共用了几次?
分析:编写一个无限循环的控制,然后不停的随机生成数,当生成了99时,就退出这个无限循环。

package main
import (
	"fmt"
	"math/rand"
	"time"
) 


func main() {
	// 为了生成一个随机数,还需要给rand设置一个种子(否则是一个伪随机数一直是82)
	//time .Now().Unix() :返回一个从1970:01:01的0时0分0秒到现在的秒数
	rand.Seed(time.Now().Unix())
	fmt.Println(time.Now().Unix())
	//随机生成一个1-100的数rand.Intn(100)[0, 100)
	n := rand.Intn(100) + 1
	fmt.Println(n)

	// 计数i
	var i int = 0
	for {
		rand.Seed(time.Now().Unix())
		k := rand.Intn(100) + 1
		i++
		if k == 99{
			fmt.Println(i)
			break
		}
	}
}

注意事项和细节说明:

  1. break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
  2. 默认只会跳出最近的for循环
package main
import (
	"fmt"
	"math/rand"
	"time"
) 


func main() {
	// 指定标签形式 跳转到指定break
	label1:
	for i := 0; i < 4; i++ {
		//label2:
		for j := 0; j < 10; j++ {
			if j == 2{ 
				//break // 默认只会跳出最近的for循环
				break label1
			}
			fmt.Println("j的值是:", j)
		}
	}
}

2. continue

  1. continue语句用于结束本次循环,继续执行下一-次循环
  2. continue语 句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环,这个和前面的break标签的使用的规则一样.

3. goto

  1. Go语言的goto语句可以无条件地转移到程序中指定的行。
  2. goto语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能。
  3. 在Go程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难
  4. 基本语法:
goto label
...
label: statement
package main
import (
	"fmt"
) 


func main() {
	// 演示goto的使用
	fmt.Println("ok1") 
	goto label
	fmt.Println("ok2")
	fmt.Println("ok3")
	fmt.Println("ok4")
	label:
	fmt.Println("0k5")
	fmt.Println("ok6") 
	fmt.Println("ok7")
}

4. return

return使用在方法或者函数中,表示跳出所在的方法或函数。下面代码就不执行了。

  1. 如果retumn是在普通的函数,则表示跳出该函数,即不再执行函数中retum后面代码,也可以理解成终止函数。
  2. 如果retum是在main函数,表示终止main函数,也就是说终止程序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值