if语句
a:=10
if a>20{
fmt.Printf("a大于20")
}else if a<10{
fmt.Printf("a小于10")
}else{
fmt.Printf("a大于等于10,a小于等于20")
}
go语言的if语句和C语言的if语句的差不多,需要注意的是else 和else if要写在括号右边;go语言的if语句还可以有一个子语句
if语句的子语句
if语句的子语句的作用是用来初始化局部变量
if a:=10;a<20{
fmt.Printf("a小于20")
}else{
fmt.Printf("a小于20")
}
但要注意的是,子语句中只能有一个表达式
switch语句
Go 语言中,switch 表示选择语句的关键字, switch 语句会根据初始化表达式得出一个值,然后根据 case 语句的条件,执行相应的代码块, 最终返回特定内容。每个 case被称为一种情况,只有当初始化语句的值符合 case 的条件语句时, case才会被执行 。如果没有遇到符合的 case,则可以使用默认的 case (default case),如果己经遇到了符合的 case , 那么后面的 case 都不会被执行。
switch语句有两种类型
- 表达式switch
- 类型switch
表达式switch
表达式switch的一种写法和C语言的switch类似,不过没有break语句。
grade:=80
switch grade{
case 60:
fmt.Println("及格")
case 80:
fallthrough
case 90:
fmt.Println("优秀")
}
fallthrough关键字的作用是把case的控制权交给下一个case,这个程序输出优秀
grade:=80
switch{
case grade>=60:
fmt.Println("及格了")
case grade<60:
fmt.Println("没有及格")
}
类型switch
var x interface{}
x=1
switch i:=x.(type){
case int:
fmt.Printf("x的类型是%T\n",i)
case float64:
fmt.Printf("x的类型是%T",i)
default:
fmt.Println("其他类型");
}
类型switch判断的变量必须是具有接口类型的变量
循环语句
go语言只有for循环没有while循环
for循环的几种形式
for initialization;condition;post{}
for i:=0;i<5;i++{
fmt.Println(i)
}
1for ;condition;post{}
for ;i<5;i++{
fmt.Println(i)
}
for condition{} 相当于while循环
for{} 死循环
for range
str:="abcd"
for i,ch:=range str{
fmt.Printf("字符串的第%d个字符值为%d",i,ch)
}
for _,ch:=range str{
fmt.Println(ch)
}
for i,_:=range str{
fmt.Println(i)
}
for和range结合可以轮询字符串的每一个字符,这种方式也可以用来轮询数组、切片、字典等。range返回的是一对 索引–值
range的返回值
右边表达式的类型 | 第一个值 | 第二个值 |
---|---|---|
string | index | str[index] |
arr/slice | index | arr[index]/slice[index] |
map | key | map[key] |
延迟语句defer
defer用来延迟调用一个函数(在函数的最后执行),只能在一个函数内部使用
而且函数是执行完所有defer语句才执行return语句的。
func main(){
defer fmt.Println("好")
fmt.Println("你")
}
那么在一个函数内有多个defer语句会以什么顺序执行?
最后的defer语句最先执行,defer语句就是一个栈。
func main(){
for i:=0;i<5;i++{
defer fmt.Println(i)
}
}
break语句
var i int =0
for{
if i>5{
break
}
i++
fmt.Println("for循环结束了?")
}
fmt.Println("for循环结束了")
go语言的break有一个比较坑的地方
for{
grade:=80
switch{
case grade>60:
fmt.Println("及格了")
break
case grade==60:
fmt.Println("差点没及格")
case grade<60:
fmt.Println("没有及格")
}
}
这个时候break根本就不会跳出for循环,也就是说这个循环还是个死循环!!!要想跳出这个循环就必须要用标签
、
loop:for{
grade:=80
switch{
case grade>60:
fmt.Println("及格了")
break loop
case grade==60:
fmt.Println("差点没及格")
case grade<60:
fmt.Println("没有及格")
}
}