这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
目录:
- 【手把手教你写Go】01.为什么要选择Go语言
- 【手把手教你写Go】02.hello world
- 【手把手教你写Go】03.基本数据类型
- 【手把手教你写Go】04.运算符和流程控制
- 【手把手教你写Go】05.函数
- 【手把手教你写Go】06.工程管理
- 【手把手教你写Go】07.复合类型-指针
- 【手把手教你写Go】08.复合类型-数组和切片
- 【手把手教你写Go】08.复合类型-map
- 【手把手教你写Go】09.复合类型- 结构体
- 【手把手教你写Go】10. 面向对象编程
- 【手把手教你写Go】11. 异常处理
- 【手把手教你写Go】12. 文本处理
- 【手把手教你写Go】13. 并发编程- 并发入门
3. 运算符
3.1 算术运算符
| 运算符 | 术语 | 示例 | 结果 |
|---|---|---|---|
| + | 加 | 10 + 5 | 15 |
| - | 减 | 10 - 5 | 5 |
| * | 乘 | 10 5 | 50 |
| / | 除 | 10 / 5 | 2 |
| % | 取模(取余) | 10 % 3 | 1 |
| ++ | 后自增,没有前自增 | a=0; a++ | a=1 |
| -- | 后自减,没有前自减 | a=2; a-- | a=1 |
3.2 关系运算符
| 运算符 | 术语 | 示例 | 结果 |
|---|---|---|---|
| == | 相等于 | 4 == 3 | false |
| != | 不等于 | 4 != 3 | true |
| < | 小于 | 4 < 3 | false |
| 大于 | 4 > 3 | true | |
| <= | 小于等于 | 4 <= 3 | false |
| >= | 大于等于 | 4 >= 1 | true |
3.3 逻辑运算符
| 运算符 | 术语 | 示例 | 结果 | ||
|---|---|---|---|---|---|
| ! | 非 | !a | 如果a为假,则!a为真;如果a为真,则!a为假。 | ||
| && | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 | ||
| | | | 或 | a | b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |
3.4 位运算符
| 运算符 | 术语 | 说明 | 示例 | |
|---|---|---|---|---|
| & | 按位与 | 参与运算的两数各对应的二进位相与 | 60 & 13 结果为12 | |
| | | 按位或 | 参与运算的两数各对应的二进位相或 | 60 | 13 结果为61 |
| 异或 | 参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1 | 60 ^ 13 结果为240 | ||
| << | 左移 | 左移n位就是乘以2的n次方。 左边丢弃,右边补0。 | 4 << 2 结果为16 | |
| >> | 右移 | 右移n位就是除以2的n次方。 右边丢弃,左边补位。 | 4 >> 2 结果为1 |
3.5 赋值运算符
| 运算符 | 说明 | 示例 | |||
|---|---|---|---|---|---|
| = | 普通赋值 | c = a + b 将 a + b 表达式结果赋值给 c | |||
| += | 相加后再赋值 | c += a 等价于 c = c + a | |||
| -= | 相减后再赋值 | c -= a 等价于 c = c - a | |||
| = | 相乘后再赋值 | c = a 等价于 c = c a | |||
| /= | 相除后再赋值 | c /= a 等价于 c = c / a | |||
| %= | 求余后再赋值 | c %= a 等价于 c = c % a | |||
| <<= | 左移后赋值 | c <<= 2 等价于 c = c << 2 | |||
| >>= | 右移后赋值 | c >>= 2 等价于 c = c >> 2 | |||
| &= | 按位与后赋值 | c &= 2 等价于 c = c & 2 | |||
| ^= | 按位异或后赋值 | c ^= 2 等价于 c = c ^ 2 | |||
| = | 按位或后赋值 | c | = 2 等价于 c = c | 2 |
3.6 其他运算符
| 运算符 | 术语 | 示例 | 说明 |
|---|---|---|---|
| & | 取地址运算符 | &a | 变量a的地址 |
| 取值运算符 | a | 指针变量a所指向内存的值 |
3.7 运算符 优先级
在Go语言中,一元运算符拥有最高的优先级,二元运算符的运算方向均是从左至右。
下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:
| 优先级 | 运算符 | |
|---|---|---|
| 7 | ^ ! | |
| 6 | * / % << >> & &^ | |
| 5 | + - | ^ |
| 4 | == != < <= >= > | |
| 3 | <- | |
| 2 | && | |
| 1 | | | |
4.流程控制
Go语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。
- 顺序结构:程序按顺序执行,不发生跳转。
- 选择结构:依据是否满足条件,有选择的执行相应功能。
- 循环结构:依据条件是否满足,循环多次执行某段代码。
4.1 选择结构
4.1.1 if语句
4.1.1.1 if
var a int = 3
if a == 3 { //条件表达式没有括号
fmt.Println("a==3")
}
//支持一个初始化表达式, 初始化字句和条件表达式直接需要用分号分隔
if b := 3; b == 3 {
fmt.Println("b==3")
}
4.1.1.2 if ... else
if a := 3; a == 4 {
fmt.Println("a==4")
} else { //左大括号必须和条件语句或else在同一行
fmt.Println("a!=4")
}
4.1.1.3 if ... else if ... else
if a := 3; a > 3 {
fmt.Println("a>3")
} else if a < 3 {
fmt.Println("a<3")
} else if a == 3 {
fmt.Println("a==3")
} else {
fmt.Println("error")
}
4.1.2 switch语句
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码:
var score int = 90
switch score {
case 90:
fmt.Println("优秀")
//fallthrough
case 80:
fmt.Println("良好")
//fallthrough
case 50, 60, 70:
fmt.Println("一般")
//fallthrough
default:
fmt.Println("差")
}
可以使用任何类型或表达式作为条件语句:
//1
switch s1 := 90; s1 { //初始化语句;条件
case 90:
fmt.Println("优秀")
case 80:
fmt.Println("良好")
default:
fmt.Println("一般")
}
//2
var s2 int = 90
switch { //这里没有写条件
case s2 >= 90: //这里写判断语句
fmt.Println("优秀")
case s2 >= 80:
fmt.Println("良好")
default:
fmt.Println("一般")
}
//3
switch s3 := 90; { //只有初始化语句,没有条件
case s3 >= 90: //这里写判断语句
fmt.Println("优秀")
case s3 >= 80:
fmt.Println("良好")
default:
fmt.Println("一般")
}
4.2 循环语句
4.2.1 for
for 初始化条件 ; 判断条件 ; 条件变化 var i, sum int //1) 初始化条件 i := 1 //2) 判断条件是否为真, i <= 100, 如果为真,执行循环体,如果为假,跳出循环 //3) 条件变化 i++ //4) 重复2, 3, 4
for i = 1; i <= 100; i++ {
sum += i
}
fmt.Println("sum = ", sum)
4.2.2 range
关键字 range 会返回两个值,第一个返回值是元素的数组下标,第二个返回值是元素的值:
s := "abc"
for i := range s { //支持 string/array/slice/map。
fmt.Printf("%c\n", s[i])
}
for _, c := range s { // 忽略 index
fmt.Printf("%c\n", c)
}
for i, c := range s {
fmt.Printf("%d, %c\n", i, c)
}
for i := range str { //第2个返回值,默认丢弃,返回元素的位置(下标)
fmt.Printf("str[%d]=%c\n", i, str[i])
}
for i, _ := range str { //第2个返回值,默认丢弃,返回元素的位置(下标)
fmt.Printf("str[%d]=%c\n", i, str[i])
}
4.3 跳转语句
4.3.1 break和continue
在循环里面有两个关键操作break和continue,break操作是跳出当前循环,continue是跳过本次循环。
for i := 0; i < 5; i++ {
if 2 == i {
//break //break操作是跳出当前循环
continue //continue是跳过本次循环
}
fmt.Println(i)
}
注意:break可⽤于for、switch、select,⽽continue仅能⽤于for循环。
4.3.2 goto
用goto跳转到必须在当前函数内定义的标签:
func main() {
for i := 0; i < 5; i++ {
for {
fmt.Println(i)
goto LABEL //跳转到标签LABEL,从标签处,执行代码
}
}
fmt.Println("this is test")
LABEL:
fmt.Println("it is over")
}