流程结构
流程结构
和c及java一样,go程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。
顺序结构:从上向下,逐行执行。
选择结构:条件满足,某些代码才会执行。0-1次
分支语句:if,switch,select
循环结构:条件满足,某些代码会被反复的执行多次。0-N次
循环语句:for
if
if的基本表达
GO中的if与c和Java中的基本一致,只是表达方法不一样,Go的if不需要使用括号
如代码所示
if 布尔表达式1 {
/* 在布尔表达式1为 true 时执行 */
} else if 布尔表达式2{
/* 在布尔表达式1为 false ,布尔表达式2为true时执行 */
} else{
/* 在上面两个布尔表达式都为false时,执行*/
}
特殊用法
Go语言中的if语句还有一个特殊用法
if statement; condition {
}
代码中的statemen表示创建一个作用域在if中的数据,分号后表示条件
示例代码
if num := 10; num % 2 == 0 {
//checks if number is even
fmt.Println(num,"is even")
} else {
fmt.Println(num,"is odd")
}
switch
swith基本用法
和c以及java一样,可以用if来表示的语句基本都可以使用switch来表示
switch var1 {
case val1:
...
case val2:
...
default:
...
}
但是Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。感觉在这一点上比c和Java要更方便
case中的表达式是可选的,可以省略。如果该表达式被省略,则被认为是switch true,并且每个case表达式都被计算为true,并执行相应的代码块。
如代码所示
package main
import "fmt"
func main() {
/* 定义局部变量 */
var grade string = "B"
var marks int = 90
switch marks {
case 90: grade = "A"
case 80: grade = "B"
case 50,60,70 : grade = "C" //case 后可以由多个数值
default: grade = "D"
}
//switch后没有变量的话默认switch后跟bool型true
switch {
case grade == "A" :
fmt.Printf("优秀!\n" )
case grade == "B", grade == "C" :
fmt.Printf("良好\n" )
case grade == "D" :
fmt.Printf("及格\n" )
case grade == "F":
fmt.Printf("不及格\n" )
default:
fmt.Printf("差\n" );
}
fmt.Printf("你的等级是 %s\n", grade );
}
fallthrough
如需贯通后续的case,就添加fallthrough
case
package main
import (
"fmt"
)
type data [2]int
func main() {
switch x := 5; x {
default:
fmt.Println(x)
case 5:
x += 10
fmt.Println(x)
fallthrough
case 6:
x += 20
fmt.Println(x)
}
}
运行结果
15
35
注意:switch的注意事项
- case后的常量值不能重复
- case后可以有多个常量值
- fallthrough应该是某个case的最后一行。如果它出现在中间的某个地方,编译器就会抛出错误。
Type Switch
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
例如
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 init; condition; post { }
例如
func main() {
for i := 1; i <= 10; i++ {
fmt.Printf(" %d",i)
}
和if一样在for循环中声明的变量仅在循环范围内可用。因此,上述代码中的i不能在外部访问循环。
for语法2
在for循环中,如果变量已经声明,在for中可以只存在判断语句
例如
var b int = 15
var a int
for a < b {
a++
fmt.Printf("a 的值为: %d\n", a)
}
for的range格式
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
如:
for key, value := range oldMap {
newMap[key] = value
}