一、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 的使用的注意事项和细节:
case
/switch
后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以)case
后的各个表达式的值的数据类型,必须和switch
的表达式数据类型一致case
后面可以带多个表达式,使用逗号间隔。比如case
表达式 1, 表达式 2 …case
后面的表达式如果是常量值(字面量),则要求不能重复case
后面不需要带break
,程序匹配到一个case
后就会执行对应的代码块,然后退出switch
,如果一个都匹配不到,则执行default
default
语句不是必须的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("没有匹配到..")
}
Type Switch
: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("未知型")
二、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")
}