Go:程序流程控制

一、switch分支控制

  • switch语句用于基于不同条件执行不同动作,每一个case分支都是唯一的, 从上到下逐一测试,直到匹配为止
  • 匹配项后面也不需要再加break

语法:

switch表达式{

	case 表达式1,表达式2,..:
		语句块1
	case表达式3,表达式4,..:
		语句块2
	//这里可以有多个case语句
	
	default:
		语句块
}

基本代码:

var key byte
fmt.Println(”请输入个字符 a,b,c,d,e,f,g")
fmt.Scanf("%c", &key)
switch key {
	case 'a':
		fmt.Print1n("周一,猴子穿新衣")
	case 'b':
		fmt.Println("周二,猴子当小二")
	case 'c':
		fmt.Print1n("周三,猴子爬雪山")
	//...
	default:
		fmt.Print1n( "输入有误...")
}

switch 的使用的注意事项和细节:

  1. case/switch后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以)
  2. case后的各个表达式的值的数据类型,必须和switch的表达式数据类型一致
  3. case 后面可以带多个表达式,使用逗号间隔。比如 case表达式 1, 表达式 2 …
  4. case后面的表达式如果是常量值(字面量),则要求不能重复
  5. case后面不需要带break,程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个都匹配不到,则执行default
  6. default语句不是必须的
  7. switch穿透fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透
var num int = 10
switch num {
	case 10:
		fmt.Println("ok1")
		fallthrough //默认只能穿透层
	case 20:
		fmt.Println("ok2")
		fallthrough
	case 30:
		fmt.Println("ok3")
	default :
		fmt.Println("没有匹配到..")
}

  1. Type Switchswitch语句还可以被用于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("未知型")

二、for循环控制

语法:

①第一种

for 循环变量初始化;循环条件;循环变量迭代 { 
	循环操作(语句)
}
for i:=1;i<=10;i++{
	fmt.Print1n("Hello ",i)
}

②第二种

for 循环判断条件 {
	//循环执行语句
}
j:=1
for j<=10{
	fmt.Println("Hello ",j)
	j++
}

③第三种

for { 
	//循环执行语句
}

上面的写法等价for;; {}是一个无限循环, 通常需要配合break语句使用

k :=1
for{//这里也等价for;;{
	if k<=10 {
		fmt.Print1n("ok~~", k)
	} else {
		break
	}
	k++
}

④第四种
Go提供for-range的方式,可以方便遍历字符串和数组

str := "hello"
for index, val := range str {
	fmt.Printf("index=%d,val=%c \n", index, val)
}

输出:
在这里插入图片描述
如果我们的字符串含有中文,那么传统的遍历字符串方式,就是错误,会出现乱码。原因是传统的对字符串的遍历是按照字节来遍历,而一个汉字在utf8编码是对应3个字节。 如何解决需要:将str转成[]rune切片。

str := "你好,go"
str2 := []rune(str)
for i := 0; i < len(str2); i++ {
	fmt.Printf("%c \n", str2[i])
}

对应for-range遍历方式而言,是按照字符方式遍历。因此如果有字符串有中文也是支持的。

str := "你好,Go"
for index, val := range str {
	fmt.Printf("index=%d,val=%c \n", index, val)
}

三、跳转控制语句goto

  • Go语言的goto语句可以无条件地转移到程序中指定的行
  • goto语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能
  • Go程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序产生困难

语法:

goto label
...
label:statement

案例:

func main() {
	n := 30
	//演示goto的使用
	fmt.Println("ok1")
	if n > 20 {
		goto label1
	}
	fmt.Println("ok2")
	fmt.Println(" ok3")
	fmt.Println(" ok4")
	label1:
	fmt.Println("ok5")
	fmt.Println("ok6")
	fmt.Println("ok7")
}

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章