流程控制
这部分主要是,学习go的 if / switch / for
1. if 在判断前可以做些初始化
// 这里a的初始化只对if内部有效
if a := 12; a < 14 {
fmt.Println("a小于14")
}
a := 23
//除了可以初始化值以外 还可以打印值
if fmt.Println("开始判断了"); a > 10 {
fmt.Println("此时a大于10")
}
2. for 循环基础用法
在go中没有while,都是通过for实现的
// 1. 最标准的用法
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// 2. 充当while功能
a := 10
for a > 1 { // 只要a大于1就会一直执行
fmt.Println(a)
a--
}
// 3. 无限循环
b := 99
for {
if b < 80 {
break
}
fmt.Println(b)
b--
}
3. for 配合range做迭代器(string/map/slice/array/channel)
str := "abc"
// 这里可以省略第一个参数
for i := range str {
// 默认情况下这里是asica编码 这里用%c
fmt.Printf("%c\n", str[i])
}
// a
// b
// c
ss := []int{1, 2, 3, 4}
for index, val := range ss {
fmt.Printf("index: %d; val: %d\n", index, val)
}
// index: 0; val: 1
// index: 1; val: 2
// index: 2; val: 3
// index: 3; val: 4
4. for range时候非引用类型(数组要注意)range时候的生效问题
arr1 := [3]int{1, 2, 3}
for i, val := range arr1 { // 由于数组是值传递,所以在range运行中修改的arr1 不会对一开始range的数组值产生影响
if i == 0 {
arr1[1] = 111
arr1[2] = 222
fmt.Println(arr1) // 保证修改后是有效的
}
arr1[i] = val + 100
}
fmt.Println(arr1)
// [101 102 103]
// 如果这里是一个引用类型则会在rang时生效
ss := []int{1, 2, 3}
for i, val := range ss {
if i == 0 {
ss[1] = 111
ss[2] = 222
fmt.Println(ss)
}
ss[i] = val + 100
}
fmt.Println(ss)
//[101 211 322]
5. switch用法
- 无表达式,在每个case中判断
score := 89 // 分数
grade := "A" // 成绩
switch {
case score >= 90: // 以冒号结尾
grade = "A" //
case score >= 80:
grade = "B" //
case score >= 70:
grade = "C" //
default: //
grade = "D"
}
fmt.Printf("我的成绩是%s\n", grade)
// 我的成绩是B
- 有表达式,在每个case中等值判断
package main
import "fmt"
func main() {
checkType("abc")
checkType(23)
}
// 这里的 x类型是 interface 任意类型的值
func checkType(x interface{}) {
// 表达式写在switch中 只有interface才能用x.(type) 方法
switch x.(type) {
case nil:
fmt.Println("这是nil")
case string:
fmt.Println("这是字符串")
case bool:
fmt.Println("这是布尔类型")
case float32:
fmt.Println("这是一个浮点类型")
case int8, int16, int32, int64: // 可以是多个类型
fmt.Println("这是一个整数类型")
default:
fmt.Println("这是其它类型")
}
}
网友评论