枚举类型用于声明一组命名的常量,当一个变量有几种可能的取值时,可以将它定义为枚举类型。在 Go 语言中,并没有提供枚举类型,但是枚举类型又是开发过程中非常重要的数据类型。因为它可以事先定义一组有效的值,可以有效地防止用户提交无效数据,抽象到业务场景中就是我们平时网页上遇到的下拉框,或者我们选择快递地址时的省市信息,均为枚举类型的用武之地。所以在 Go 语言中对常量进行了一定的扩展,使其可以完美地替代枚举类型。
const ( Sun Weekday = iota Mon Tues Wed Thur Fri Sat )
func(w Weekday) String() string { switch w { case Sun: return"Sun" case Mon: return"Mon" case Tues: return"Tues" case Wed: return"Wed" case Thur: return"Thur" case Fri: return"Fri" case Sat: return"Sat" } //不存在的枚举类型就返回"N/A" return"N/A" }
funcmain() { var a = 28 var b = 99 a = b fmt.Println(" a = b :", a) a = 28 a += b fmt.Println(" a += b :", a) a = 28 a -= b fmt.Println(" a -= b :", a) a = 28 a *= b fmt.Println(" a *= b :", a) a = 28 a /= 2 fmt.Println(" a /= 2 :", a) a = 28 b %= 1 fmt.Println(" b %= 1 :", a) a = 28 a &= b fmt.Println(" a &= b :", a) a = 28 a |= b fmt.Println(" a |= b :", a) a = 28 a ^= b fmt.Println(" a ^= b :", a) a = 28 a >>= 2 fmt.Println("a >>= 2 :", a) a = 28 b <<= 1 fmt.Println("b <<= 1 :", a) }
2. 优先级
下表为各运算符的优先级示图,优先级从高到低:
优先级
类别
运算符
1
括号运算符
()
2
单目运算符
!、++、–
3
算数运算符
*、/、%
4
+、-
5
位移运算符
>>、<<
6
关系运算符
<、<=、>、>=
7
==、!=
8
按位与
&
9
按位异或
^
10
按位或
|
11
逻辑与
&&
12
逻辑或
||
13
赋值运算符
=、+=、-=、*=、/=、 %=、 >=、 <<=、&=、^=、|=
Go语言的分支语句
1. If…else
在 Go 语言中 if 关键字的作用和其它大部分语言相同,是用于测试某个布尔表达式或布尔值是否为真的。若为真则执行 if 之后 {} 中的语句,否则跳过这些语句。如果存在第二个分支,则需要使用 else 关键字,还需要增加分支的话就需要使用 else if 关键字了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
package main
import"fmt"
funcmain() { a := 10 if a > 10 { fmt.Println("a大于10") } elseif a < 0 { fmt.Println("a小于0") } else { fmt.Println("a的值是", a) } }
在 Go 语言中,if 后的条件表达式,还有一种特别的写法,可以在条件表达式之前写一个赋值表达式。
if…else 的特殊用法:
1 2 3 4 5 6 7 8 9 10 11 12
package main
import"fmt"
funcmain() { if a := 10; a > 10 { //赋值表达式和条件表达式之间用;隔开 fmt.Println("a大于10") } else { fmt.Println("a的值是", a) } }
2. switch…case
Go 语言对 switch…case 的功能进行了扩展,它变得更加的通用。switch 之后可以什么都不带。case也无需是一个固定值,也可以是一个布尔表达式,而且每一个 case 都是一个 独立的代码块,执行完了之后立刻跳出 switch,不需要使用 break。所以可以把 if…else 完美的改写成 switch…case 的形式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
package main
import"fmt"
funcmain() { a := "A" switch a { case"A", "a": fmt.Println("分数区间为90~100") case"B", "b": fmt.Println("分数区间为70~89") case"C", "c": fmt.Println("分数区间为0~70") default: fmt.Println("错误的评分") } }
switch…case Go 语言中的新用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
package main
import"fmt"
funcmain() { a := 50 switch { case a < 60: fmt.Println("不及格") case a < 80: fmt.Println("良好") case a <= 100: fmt.Println("优秀") default: fmt.Println("分数最多为100分") }
}
Go语言的循环语句
在 Go 语言中减少了循环语句的关键字,仅有一个 for 关键字。但是并没有减少其功能,而且它更是兼容了其它语言中的while关键字的用法,甚至更强大。
funcmain() { for a := 0; a < 10; a++ { fmt.Println(a) } }
省略单次表达式代码
1 2 3 4 5 6 7 8 9 10
package main
import"fmt"
funcmain() { a := 0 for ; a < 10; a++ { //表达式可以省略,但是;不能省略 fmt.Println(a) } }
1.2 代替 while 的用法
在其它大部分语言中 for 循环中省略单次表达式和末尾循环体其实就和其它语句中的 while 用法一致了。所以在 Go 语言中,直接使用省去单次表达式和末尾循环体的 for 循环语句来代替 while 的用法,为了简便代码书写,Go 语言中 for 循环语句在省去单次表达式和末尾循环体时,可以不写分号。
1 2 3 4 5 6 7 8 9 10 11 12
package main
import"fmt"
funcmain() { a := 0 for a < 10 { //和其他语言中的while(a<10)一致 fmt.Println(a) a++ } }
2. for 语言中的break 和 continue
在我们的生产环境中,经常需要用到死循环的场景。所以在 Go 语言中新增了一个 for 关键字死循环的用法,让程序员不用写无聊的 for(;;){}和do{} while(1)。同时可以使用 break 和 continue 来控制循环。
break 和 continue 的逻辑和语法类似
2.1 break跳出单层死循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14
package main
import"fmt"
funcmain() { a := 0 for { //死循环的写法就是省略 单次表达式; 条件表达式; 末尾循环体 fmt.Println(a) a++ if a >= 10 { break//跳出死循环 } } }
2.2 break跳出多层死循环
在其它语言中,你很难去控制跳出循环的层数,在 Go 语言中提供了一种break LOOP的写法,可以使循环跳出到 LOOP 所在的位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
package main
import"fmt"
funcmain() { a := 0 LOOP: for { for { fmt.Println(a) a++ if a >= 10 { break LOOP //跳出循环至LOOP所在的层级 } } } }
Go语言的通道
Go 语言中有一个特殊的类型 chan,这是在 Go 语言的多线程操作中非常重要的一个数据类型。它的一般用于线程之间的数据传输,所以这个操作类型叫做 “ 通道 (channel)“。