在上一篇博文中,我们介绍了Go里的基本类型,接下来将记录一下Go中常用的运算符以及逻辑控制:
运算符
算术运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模 | 10 % 5 | 0 |
++ | 自增 | a := 0; a++ | 1 |
– | 自减 | a := 1; a– | 0 |
关系运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
== | 相等于 | 4 == 3 | false |
!= | 不等于 | 4 != 3 | true |
< | 小于 | 4 < 3 | false |
> | 大于 | 4 > 3 | true |
<= | 小于或等于 | 4 <= 3 | false |
>= | 大于或等于 | 4 >= 3 | true |
逻辑运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
! | 非 | !a | 若a为真,则结果为假;若a为假,则结果为真 |
&& | 与 | a && b | 若a与b都为真,则结果为真;否则为假 |
|| | 或 | a || b | 若a或者b为真,则结果为真;否则为假 |
赋值运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
= | 普通赋值 | c = a + b | 将a+b的结果赋值给c |
+= | 相加后赋值 | c += 1 | 将c+1的结果赋值给c |
-= | 相减后赋值 | c -= 1 | 将c-1的结果赋值给c |
*= | 相乘后赋值 | c *= 2 | 将c * 2的结果赋值给c |
/= | 相除后赋值 | c /= 2 | 将c / 2的结果赋值给c |
流程控制
if…else…
if
判断语句是在各种编程语言中最为常见的了,它的语法就是如果满足条件就做某事,否则就做另一件事,如下:
if a == 1 {
fmt.Println("a == 1")
}else if a== 2 {
fmt.Println("a == 2")
}else {
fmt.Println("a != 1 and a != 2")
}
Go中的if
还允许在判断语句里声明一个变量,这个变量的作用域只能在该条件逻辑块内,其他地方就不起作用了,如下:
if a := 10; a > 1 {
fmt.Println("a > 1")
}else {
fmt.Println("a <= 1")
}
switch
有些时候你需要写很多if...else...
来实现一些逻辑处理,这个时候代码就看上去很丑很冗长,而且也不易于以后的维护,这个时候我们就可以使用switch
来很好的解决这个问题,如下:
a := 20
switch a {
case 10:
fmt.Println("a == 10")
break
case 20:
fmt.Println("a == 20")
break
default:
fmt.Println("a == other")
break
}
Go中对switch
语法进行一下简化,在每一步的逻辑处理完成之后,Go会自动加上break,所以无需自己手动进行添加,我们可以将其省略掉,如下:
a := 20
switch a {
case 10:
fmt.Println("a == 10")
case 20:
fmt.Println("a == 20")
default:
fmt.Println("a == other")
}
我们知道switch
只要匹配到满足条件的情况之后,将会跳出,将不会往下执行其他case。但是,我们可以指定一个fallthrough
强制执行后面的case中的代码,如下:
a := 10
switch a {
case 10:
fmt.Println("a == 10")
fallthrough
case 20:
fmt.Println("a == 20")
case 30:
fmt.Println("a == 30")
default:
fmt.Println("a == other")
}
如此一来,a == 10
、a == 20
和a == 30
都将会被打印,default
中的逻辑语句不会执行!
Go的switch
非常灵活,表达式不必是常量或者整数,如下:
a := 20
switch a {
case 10:
fmt.Println("a == 10")
case 20, 30, 40:
fmt.Println("a == 20 or a == 30 or a == 40")
case 50:
fmt.Println("a == 50")
default:
fmt.Println("a == other")
}
// 打印结果如下
a == 20 or a == 30 or a == 40
此外,switch
语句还可以使用关系运算符,如下:
a := 20
switch {
case a > 20:
fmt.Println("a > 20")
case a > 10:
fmt.Println("20 >= a > 10")
case a > 0:
fmt.Println("10 >= a > 0")
default:
fmt.Println("a <= 0")
}
// 打印结果如下
20 >= a > 10
for
Go里面最为强大的一个控制逻辑就是for
,for
循环也是在其他语言中非常常见的,它既可以用来循环读取数据,还是当做while来控制逻辑,还能迭代操作,语法如下:
for expression1; expression2; expression3 {
...
}
较为常规的for
循环操作,如下:
for a := 1; a <= 10; a++ {
fmt.Println(a)
}
我们也可以忽略expression1
和expression3
来实现上面的需求,如下:
a := 1
for ; a <= 10; {
fmt.Println(a)
a++
}
跟其他语言一样,for
循环也支持break
与continue
关键字,并且作用一样!
range
for
可以跟range
结合起来使用来读取slice
和map
的数据,如下:
s := []int{1, 2, 3}
for i, j := range s {
fmt.Println(i, j)
}
// 打印结果如下
0 1
1 2
2 3
s := make(map[string]int)
s["age"] = 18
s["sex"] = 1
for i, j := range s {
fmt.Println(i, j)
}
// 打印结果如下
age 18
sex 1
从打印结果可以看出,第一个值为slice
的下标或map
的key,第二个值为slice
的下标对应的值或map
中key对应的值!!!
如果,我们只是需要slice
的下标或者map
的key时,我们可以这样:
s := []int{1, 2, 3}
for data := range s {
fmt.Println(data)
}
// 打印结果如下
0
1
2
s := make(map[string]int)
s["age"] = 18
s["sex"] = 1
for data := range s {
fmt.Println(data)
}
// 打印结果如下
age
sex
除了这种方法之外,你也可以使用_
方式来丢弃值!
goto
使用goto
跳转到必须在当前函数内定义的标签,如下:
package main
import "fmt"
func main() {
fmt.Println("aaaaaaaaaaa")
goto Next
fmt.Println("bbbbbbbbbbb")
Next:
fmt.Println("ccccccccccc")
}
// 打印结果如下
aaaaaaaaaaa
ccccccccccc
从结果可以看出,当代码运行到goto
时,直接寻找标签Next
,跳到Next标签下的内容继续运行!此功能请谨慎使用,否则将会使你的代码非常混乱!!!
至此,Over~~~~