go20/day01/operate/README.md
yumaojun03 0761778363 ```
docs(day01): 添加运算符和变量作用域文档

- 新增运算符文档,详细介绍Go语言的算术、关系、逻辑、位、赋值等运算符
- 添加变量作用域文档,涵盖局部变量、全局变量、作用域嵌套和可见性规则
- 补充相关代码示例和实践案例
- 更新README目录结构,添加新章节链接
```
2025-12-28 15:53:05 +08:00

166 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 语言运算符
Go 语言内置的运算符有:
+ 算术运算符
+ 关系运算符
+ 逻辑运算符
+ 位运算符
+ 赋值运算符
+ 其他运算符
## 算术运算符
+ \+ 加法运算
+ \- 减法运算
+ \* 乘法运算
+ / 除法运算
+ % 求余运算
由于Go是强类型语言, 因此要求参与运算的对象类型必须相同,比如下面就是不可以的
```go
// var (
// a = 10
// b = 20
// )
var a, b uint = 10, 20
a + b // 30
a - b // 18446744073709551606
```
```go
a * b // 200
a / b // 0
a % b // 10
```
浮点型的运算
```go
var a, b float64 = 10, 20
a + b // 30
a - b // -10
a * b // 200
a / b // 0.5
```
## 关系运算符
用于对2个值进行比较的运算符, 比较结果为真(True) 或者 假(False)
+ == 判断两个值是否相等
+ != 判断两个值是否不相等
+ \> 左边值是否大于右边值
+ \>= 左边值是否大于等于右边值
+ < 左边值是否小于右边值
+ <= 左边值是否小于等于右边值
```go
a, b := 10, 20
a > b
a >= b
a < b
```
常见的用法是用于条件语句: 我们进行一个a b 的简单排序
```go
a, b := 20, 10
if a > b {
a, b = b, a
}
```
## 逻辑运算符
用于对布尔表达式进行逻辑计算, 有如下3种:
+ && (ADD), 如果两边的操作数都是 True则条件 True否则为 False
+ || (OR), 如果两边的操作数有一个 True则条件 True否则为 False
+ ! (NOT), 如果条件为 True则逻辑 NOT 条件 False否则为 True
```go
age := 90
gender := "male"
if age > 80 && gender == "male" {
fmt.Println("old boy")
} else {
fmt.Println("too young,too simple")
}
```
## 位运算符
位运算符对整数在内存中的二进制位进行操作, 运算符有:
+ & 按位与, 参与运算的两数各对应的二进位相与 当两对应的二进位, 都为1时, 结果为1
+ | 按位或, 参与运算的两数各对应的二进位相或, 当两对应的二进位, 有1方为1结果为1
+ ^ 按位异或, 参与运算的两数各对应的二进位相异或, 当两对应的二进位相异时结果为1
+ 左移 高位丢弃低位补0, 左移n位就是乘以2的n次方
+ 右移 高位丢弃低位补0, 移n位就是除以2的n次方
```go
var (
a uint = 60 // 0011 1100 2^5 + 2^4 + 2^3 + 2^2
b uint = 85 // 0101 0101 2^6 + 2^4 + 2^2 + 2^0
)
fmt.Println("a & b = %d", a&b) // 0001 0100 2^4 + 2^2
fmt.Println("a | b = %d", a|b) // 0111 1101 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^0
fmt.Println("a ^ b = %d", a^b) // 0110 1001 2^6 + 2^5 + 2^3 + 2^0
fmt.Println("a >> 2 = %d", a>>2) // 0000 1111 15
fmt.Println("a << 2 = %d", a<<2) // 1111 0000 240
```
常用与协议定义, 比如一个byte 8位
```go
0000 0000
--
标识性别: 00: 未知 01: 10: 11: 保留
--
保留
----
标识城市: 0000: 未知, 0001: A, 0010: B
```
byte 0x17 表示什么? (十进制: 23, 二进制: 0001 0111)
## 赋值运算符
最基本用法:
+ = 简单的赋值运算符将一个表达式的值赋给一个左值
```go
a := 10 // 把10赋值给变量a
```
+ += 相加后再赋值
+ -= 相减后再赋值
+ *= 相乘后再赋值
+ /= 相除后再赋值
+ %= 求余后再赋值
+ <<= 左移后赋值
+ \>\>= 右移后赋值
+ &= 按位与后赋值
+ |= 按位异或后赋值
+ ^= 按位或后赋值
```go
a := 10
a += 5 // a = a + 5
```
## 其他运算符
+ & 返回变量存储地址
+ \* 取出地址对应的值
```go
a := 10
b := &a
*b += 5
```