Go语言学习笔记(五)
一、控制流程
前言:所谓的控制流程其实就是C++
或者是python
的if-else
语句等
1 if语句
package main
import "fmt"
func main() {
b := true
if b {
fmt.Println("b is true!")
}
}
这里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")
}
}
关于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")
}
}
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")
}
}
在这里要注意的是不像if
语句一样,switch
后面的判断条件可以不为bool
值,但是要保证switch
后面的参数和case
的参数要类型一致;
和C++不一样的是每一个case是独立的,执行完某个case之后并不会顺位继续执行下一个case,就是说不需要刻意的像C++一样添加break关键字。
switch语句执行多条匹配
switch{
case 1,2,3,4:
default:
}
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
*/
}
一个特殊的例子
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 );
}
这里之所以觉得他特殊,是因为第二个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)
}
}
8.2 包含初始化语句和后续语句的for语句
这个for
语句格式就很全乎了
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
fmt.Println("i is", i)
}
}
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)
}
}
这里注意,定义数组时使用的是{}
而不是[]
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")
}
关于defer
语句,我的理解是:他在return
语句之前,语句块最后一句语句执行之后执行,我觉得可以理解为是类似于析构函数的东东
百度到的一些资料:Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。
关键字 defer 的用法类似于面向对象编程语言 Java 和 C# 的 finally 语句块,它一般用于释放某些已分配的资源,典型的例子就是对一个互斥解锁,或者关闭一个文件。
参考书籍
[1]: 【Go语言入门经典】[英] 乔治·奥尔波 著 张海燕 译
题外话:
- 挺好,身体健康,按时长大