Go语言学习笔记(五)
一、控制流程
前言:所谓的控制流程其实就是C++或者是python的if-else语句等
1 if语句 package main import "fmt" func main() { b := true if b { fmt.Println("b is true!") } } 1 2 3 4 5 6 7 8 这里if语句也没啥可写的,要注意一点就是在Go中if后面的元素一定得是bool类型,因为Go是静态类型语言,不支持类型转换(转换得用strconv包中对应的函数)。
2 else语句 else语句指定了到达该分支时执行的代码。它不做任何判断,只要到达它所在的分支就执行。只要前面有语句的结果为true,else语句就不会执行。在Go语言中,else语句紧跟在其他语句的右大括号后面,通常是当前语句块中的最后一条语句、大致而言,else相当于说:如果其他条件都不为true,就执行这条语句。
package main import "fmt" func main() { b := false if b { fmt.Println("b is true") } else { fmt.Println("b is false") } } 1 2 3 4 5 6 7 8 9 10 关于else语句的格式和之前提到的关键词func和{在同一行一样,else必须和}在同一行,{和关键词if在同一行。
3 else if语句 else if语句和python中的elif语句是一个意思。
package main import "fmt" func main() { i := 3 if i == 3 { fmt.Println("i==3") } else if i == 2 { fmt.Println("i==2") } } 1 2 3 4 5 6 7 8 9 10 4 比较运算符 常见的比较运算符如下:
老生常谈,切记比较运算符的两个操作数的类型必须相同
5 算术运算符 常见的算术运算符如下:
字符 运算符
- 和(也叫加)
- 差(也叫减)
- 积(也叫乘) / 商(也叫除) % 余(也叫模) 同理,类型一致
6 逻辑运算符 字符 运算符 && 与:两个条件是否都为true || 或:两个条件是否至少有一个为true ! 非:条件是否为false 这里要注意的是:逻辑运算符的操作对象只能是布尔类型的变量
7 switch语句 emm不说了
package main
import "fmt"
func main() { i := 5 switch i { case 2: fmt.Println("Two") case 3: fmt.Println("Three") case 4: fmt.Println("Four") default: fmt.Println("error") } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 在这里要注意的是不像if语句一样,switch后面的判断条件可以不为bool值,但是要保证switch后面的参数和case的参数要类型一致; 和C++不一样的是每一个case是独立的,执行完某个case之后并不会顺位继续执行下一个case,就是说不需要刻意的像C++一样添加break关键字。
switch语句执行多条匹配 switch{ case 1,2,3,4: default: } 1 2 3 4 fallthrough关键字 使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。
package main
import "fmt"
func main() {
switch {
case false:
fmt.Println("1、case 条件语句为 false")
fallthrough
case true:
fmt.Println("2、case 条件语句为 true")
fallthrough
case false:
fmt.Println("3、case 条件语句为 false")
fallthrough
case true:
fmt.Println("4、case 条件语句为 true")
case false:
fmt.Println("5、case 条件语句为 false")
fallthrough
default:
fmt.Println("6、默认 case")
}
/* 2、case 条件语句为 true 3、case 条件语句为 false 4、case 条件语句为 true */ }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 一个特殊的例子 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"
default: grade = "D"
}
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 );
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 这里之所以觉得他特殊,是因为第二个switch语句中,每个case是使用了逻辑表达式作为参数,记得C++中是不可以的。C++中的switch必须跟一个变量,后面的case必须是枚举类型,或者是可比较的类型。
8 for语句 Go语言中for语句的格式有很多种,接下来一一学习.
8.1 只包含条件的for语句 初始化语句在for循环的外面定义,后续语句在循环语句块中实现,关键词for后面只有条件语句的for语句。
package main
import "fmt"
func main() { i := 0 for i < 10 { i++ fmt.Println("i is", i) } } 1 2 3 4 5 6 7 8 9 10 11 8.2 包含初始化语句和后续语句的for语句 这个for语句格式就很全乎了
package main
import "fmt"
func main() { for i := 0; i < 10; i++ { fmt.Println("i is", i) } } 1 2 3 4 5 6 7 8 9 8.3 包含range子句的for语句 package main
import "fmt"
func main() { numbers := []int{1, 2, 3, 4} for i, n := range numbers { fmt.Println("The index of the loop is", i) fmt.Println("The value from the array is", n) } }
1 2 3 4 5 6 7 8 9 10 11 12 这里注意,定义数组时使用的是{}而不是[]
9 defer语句 defer是一个很有用的Go语言功能,它能够让我们在函数返回前执行另一个函数。函数在遇到return语句或到达函数末尾时返回。defer语句通常用来执行清理操作或确保操作(如网络调用)完成后在执行另一个函数。
package main
import "fmt"
func main() { defer fmt.Println("I'm run after the function completes") fmt.Println("Hello World") }
1 2 3 4 5 6 7 8 9
关于defer语句,我的理解是:他在return语句之前,语句块最后一句语句执行之后执行,我觉得可以理解为是类似于析构函数的东东
百度到的一些资料:Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。 关键字 defer 的用法类似于面向对象编程语言 Java 和 C# 的 finally 语句块,它一般用于释放某些已分配的资源,典型的例子就是对一个互斥解锁,或者关闭一个文件。
参考书籍 [1]: 【Go语言入门经典】[英] 乔治·奥尔波 著 张海燕 译 ———————————————— CSDN