循环
n := 0
for n < 5 {
fmt.Println(n)
n ++
}
if 条件
condition是一个布尔表达式
if condition {
// code to be executed if condition is true
} else {
// code to be executed if condition is false
}
if condition-1 {
// code to be executed if condition-1 is true
} else if condition-2 {
// code to be executed if condition-2 is true
} else {
// code to be executed if both condition1 and condition2 are false
}
与其他主要编程语⾔的差异
- condition 表达式结果必须为布尔值
- ⽀持变量赋值:
if var declaration; condition {
// code to be executed if condition is true
}
这里有函数的多返回值,这里可以给到变量,通过变量结果来做判断
a := func(x,y int)int {
return x + y
}
if b := a(1,6) > 5;b{
fmt.Println("yes")
} else{
println("no")
}
优化一下,一般调用某个方法的时候,第一个变量v是本身方法的返回值,第二个是返回的错误,如果没有错误执行什么样的操作,有错误执行什么样的操作。
a := func(x,y int) (int,error) {
if x < 0 || y < 0 {
return 0,errors.New("a <0 || b < 0")
}
return x + y,nil
}
if v,err := a(1,6); err == nil {
fmt.Println(v)
} else{
println(err)
}
switch 条件
与其他主要编程语⾔的差异
for i:=0;i<=5;i++{
switch i {
case 0,2 :
fmt.Println(i,"Even")
case 1,3:
fmt.Println(i,"Odd")
default:
fmt.Println(i,"it not 0-3")
}
}
0 Even
1 Odd
2 Even
3 Odd
4 it not 0-3
5 it not 0-3
如果把switch语句当成连续的if else,那么可以通过switch简化复杂连续的if else。
注意⚠️switch i,这个时候就不需要在switch之后加变量i了,可以在case后面做判断表达。
for i:=0;i<=5;i++{
switch {
case i%2 == 0 :
fmt.Println(i,"Even")
case i%2 == 1 :
fmt.Println(i,"Odd")
default:
fmt.Println(i,"unknow")
}
}
if 条件语句比较适合分支较少的情况,如果有很多分支的话,选择 switch 会更方便,比如以上示例,使用 switch 改造后的代码如下:
switch i:=6;{
case i>10:
fmt.Println("i>10")
case i>5 && i<=10:
fmt.Println("5<i<=10")
default:
fmt.Println("i<=5")
}
switch 语句同样也可以用一个简单的语句来做初始化,同样也是用分号 ; 分隔。每一个 case 就是一个分支,分支条件为 true 该分支才会执行,而且 case 分支后的条件表达式也不用小括号 () 包裹。
在 Go 语言中,switch 的 case 从上到下逐一进行判断,一旦满足条件,立即执行对应的分支并返回,其余分支不再做判断。也就是说 Go 语言的 switch 在默认情况下,case 最后自带 break。这和其他编程语言不一样,比如 C 语言在 case 分支里必须要有明确的 break 才能退出一个 case。Go 语言的这种设计就是为了防止忘记写 break 时,下一个 case 被执行。
switch j:=1;j {
case 1:
fallthrough
case 2:
fmt.Println("1")
default:
fmt.Println("没有匹配")
}
当 switch 之后有表达式时,case 后的值就要和这个表达式的结果类型相同,比如这里的 j 是 int 类型,那么 case 后就只能使用 int 类型,如示例中的 case 1、case 2。如果是其他类型,比如使用 case "a" ,会提示类型不匹配,无法编译通过。
而对于 switch 后省略表达式的情况,整个 switch 结构就和 if……else 条件语句等同了。
switch 后的表达式也没有太多限制,是一个合法的表达式即可,也不用一定要求是常量或者整数。你甚至可以像如下代码一样,直接把比较表达式放在 switch 之后。
switch 2>1 {
case true:
fmt.Println("2>1")
case false:
fmt.Println("2<=1")
}