go-运算符与流程控制

在上一篇博文中,我们介绍了Go里的基本类型,接下来将记录一下Go中常用的运算符以及逻辑控制:

运算符

算术运算符

运算符术语示例结果
+10 + 515
-10 - 55
*10 * 550
/10 / 52
%取模10 % 50
++自增a := 0; a++1
自减a := 1; a–0

关系运算符

运算符术语示例结果
==相等于4 == 3false
!=不等于4 != 3true
<小于4 < 3false
>大于4 > 3true
<=小于或等于4 <= 3false
>=大于或等于4 >= 3true

逻辑运算符

运算符术语示例结果
!!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 == 10a == 20a == 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里面最为强大的一个控制逻辑就是forfor循环也是在其他语言中非常常见的,它既可以用来循环读取数据,还是当做while来控制逻辑,还能迭代操作,语法如下:

for expression1; expression2; expression3 {
    ...
}

较为常规的for循环操作,如下:

for a := 1; a <= 10; a++ {
    fmt.Println(a)
}

我们也可以忽略expression1expression3来实现上面的需求,如下:

a := 1
for ; a <= 10; {
    fmt.Println(a)
    a++
}

跟其他语言一样,for循环也支持breakcontinue关键字,并且作用一样!

range

for可以跟range结合起来使用来读取slicemap的数据,如下:

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~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值