Go 基础 —— (三)运算符、流程控制

Go基础 —— 目录

(一)Go 起步
(二)变量
(三)运算符、流程控制



一、运算符

优先级分类运算符结合性
1逗号运算符,从左到右
2赋值运算符= += -= *= /= %= >= <<= &= ^= |=从右到左
3逻辑或||从左到右
4逻辑与&&从左到右
5按位或|从左到右
6按位异或^从左到右
7按位与&从左到右
8相等/不相等== !=从左到右
9关系运算符< <= > >=从左到右
10位移运算符<< >>从左到右
11加法/减法+ -从左到右
12乘法/除法/取余*(乘号) / %从左到右
13单目运算符! *(指针) & ++ -- +(正好) -(负号)从右到左
14后缀运算符() [] ->从左到右

注意:优先级值越大,表示优先级越高

二、条件语句

2.1 基本写法

if condition {
	// do something
} else if confition2 {
	// do something
} else {
	// do something
}

2.2 特殊写法

if 还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值进行判断,代码如下:

if err := Connect(); err != nil {
    fmt.Println(err)
    return
}

Connect是一个带有返回值的函数,err:=Connect()是一个语句,执行Connect后,将错误保存到err变量中。

err != nil才是if的判断表达式,当err不为空时,打印错误并返回。

这种写法可以将返回值与判断放在一行进行处理,而且返回值的作用范围被限制在 if、else 语句组合中。

在编程中,变量的作用范围越小,所造成的问题可能性越小,每一个变量代表一个状态,有状态的地方,状态就会被修改,函数的局部变量只会影响一个函数的执行,但全局变量可能会影响所有代码的执行状态,因此限制变量的作用范围对代码的稳定性有很大的帮助。

三、循环语句 for

Go语言中的循环语句只支持for关键字

3.1 基本写法

sum := 0
for i := 0; i < 10; i++ {
    sum += i
}

3.2 无限循环

sum := 0
for {
    sum++
    if sum > 100 {
        break
    }
}

3.3 for中的初始语句(开始循环时执行的语句)

初始语句是在第一次循环前执行的语句,一般使用初始语句执行变量初始化,如果变量在此处被声明,其作用域将被局限在这个 for 的范围内。

step := 2
for ; step > 0; step-- {
    fmt.Println(step)
}

3.4 for中的条件表达式(控制是否循环的开关)

var i int
for ; ; i++ {
    if i > 10 {
        break
    }
}
var i int
for {
    if i > 10 {
        break
    }
    i++
}
var i int
for i <= 10 {
    i++
}

3.5 for中的结束语句(每次循环结束时执行的语句)

在结束每次循环前执行的语句,如果循环被 break、goto、return、panic 等语句强制退出,结束语句不会被执行。

四、键值循环 for range

4.1 基本写法

for range 结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道(channel),for range 语法上类似于其它语言中的 foreach 语句,一般形式为:

for key, val := range coll {
    ...
}

通过 for range 遍历的返回值有一定的规律:

  • 数组、切片、字符串返回索引和值。
  • map 返回键和值。
  • 通道(channel)只返回通道内的值。

4.2 遍历数组、切片(获得索引和值)

for key, value := range []int{1, 2, 3, 4} {
    fmt.Printf("key:%d  value:%d\n", key, value)
}

4.3 遍历字符串(获得字符)

var str = "hello 你好"
for key, value := range str {
    fmt.Printf("key:%d value:0x%x\n", key, value)
}

4.4 遍历map(获得map的键和值)

m := map[string]int{
    "hello": 100,
    "world": 200,
}
for key, value := range m {
    fmt.Println(key, value)
}

4.5 遍历通道channel(接收通道数据)

c := make(chan int)
go func() {
    c <- 1
    c <- 2
    c <- 3
    close(c)
}()
for v := range c {
    fmt.Println(v)
}

4.6 在遍历中选择希望获得的变量

m := map[string]int{
    "hello": 100,
    "world": 200,
}
for _, value := range m {
    fmt.Println(value)
}

五、Switch case

5.1 基本写法

var a = "hello"
switch a {
case "hello":
    fmt.Println(1)
case "world":
    fmt.Println(2)
default:
    fmt.Println(0)
}

注意:

  • 支持一分支多值,不同的case表达式用逗号分隔
  • 支持分支表达式,这种情况switch后面不再需要跟判断变量
var a = "mum"
switch a {
case "mum", "daddy":
    fmt.Println("family")
}

var r int = 11
switch {
case r > 10 && r < 20:
    fmt.Println(r)
}

5.2 跨越casefallthrough

在Go语言中 case 是一个独立的代码块,执行完毕后不会像C语言那样紧接着执行下一个 case,但是为了兼容一些移植代码,依然加入了 fallthrough 关键字来实现这一功能,代码如下:

var s = "hello"
switch {
case s == "hello":
    fmt.Println("hello")
    fallthrough
case s != "world":
    fmt.Println("world")
}

注意:

  • 新编写的代码,不建议使用fallthrough

六、goto

6.1 使用goto退出多层循环

6.2 使用goto集中处理错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值