# 语言运算符 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 ```