2025-12-28 15:53:05 +08:00
|
|
|
|
# 语言运算符
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|
2025-12-28 17:26:05 +08:00
|
|
|
|
|
|
|
|
|
|
// if a > b {
|
|
|
|
|
|
// //
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// ///
|
|
|
|
|
|
// }
|
2025-12-28 15:53:05 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 逻辑运算符
|
|
|
|
|
|
|
|
|
|
|
|
用于对布尔表达式进行逻辑计算, 有如下3种:
|
|
|
|
|
|
|
|
|
|
|
|
+ && 与(ADD), 如果两边的操作数都是 True,则条件 True,否则为 False。
|
|
|
|
|
|
+ || 或(OR), 如果两边的操作数有一个 True,则条件 True,否则为 False
|
|
|
|
|
|
+ ! 非(NOT), 如果条件为 True,则逻辑 NOT 条件 False,否则为 True
|
|
|
|
|
|
|
|
|
|
|
|
```go
|
2025-12-28 17:26:05 +08:00
|
|
|
|
|
|
|
|
|
|
// if age <= 35 && IsX && condtion3 {
|
|
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// online true -> offline
|
|
|
|
|
|
// if !online {
|
|
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if offline {
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-12-28 15:53:05 +08:00
|
|
|
|
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)
|
|
|
|
|
|
|
2025-12-28 17:26:05 +08:00
|
|
|
|
## 赋值运算符(=)
|
2025-12-28 15:53:05 +08:00
|
|
|
|
|
|
|
|
|
|
最基本用法:
|
|
|
|
|
|
|
|
|
|
|
|
+ = 简单的赋值运算符,将一个表达式的值赋给一个左值
|
|
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
|
a := 10 // 把10赋值给变量a
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
+ += 相加后再赋值
|
|
|
|
|
|
+ -= 相减后再赋值
|
|
|
|
|
|
+ *= 相乘后再赋值
|
|
|
|
|
|
+ /= 相除后再赋值
|
|
|
|
|
|
+ %= 求余后再赋值
|
|
|
|
|
|
+ <<= 左移后赋值
|
|
|
|
|
|
+ \>\>= 右移后赋值
|
|
|
|
|
|
+ &= 按位与后赋值
|
|
|
|
|
|
+ |= 按位异或后赋值
|
|
|
|
|
|
+ ^= 按位或后赋值
|
|
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
|
a := 10
|
|
|
|
|
|
a += 5 // a = a + 5
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 其他运算符
|
|
|
|
|
|
|
2025-12-28 17:26:05 +08:00
|
|
|
|
指针相关(稍后将)
|
|
|
|
|
|
|
2025-12-28 15:53:05 +08:00
|
|
|
|
+ & 返回变量存储地址
|
|
|
|
|
|
+ \* 取出地址对应的值
|
|
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
|
a := 10
|
|
|
|
|
|
b := &a
|
|
|
|
|
|
*b += 5
|
|
|
|
|
|
```
|