语言运算符

Go 语言内置的运算符有:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 其他运算符

算术运算符

    • 加法运算
    • 减法运算
    • 乘法运算
  • / 除法运算
  • % 求余运算

由于Go是强类型语言, 因此要求参与运算的对象类型必须相同,比如下面就是不可以的

  1. a := 10
  2. b := 10.0
  3. a + b

同理, 计算出来的结果的类型 也是参与运算的对象的类型

无符号整形的运算

  1. var a, b uint = 10, 20
  2. a + b // 30
  3. a - b // 18446744073709551606
  4. a * b // 200
  5. a / b // 0
  6. a % b // 10

浮点型的运算

  1. var a, b float64 = 10, 20
  2. a + b // 30
  3. a - b // -10
  4. a * b // 200
  5. a / b // 0.5

比较特殊的运算符:

  • ++ 自增 相当于: var = var + 1
  • — 自减 相当于: var = var - 1
  1. a := 10
  2. a++
  3. a++
  4. a++
  5. a--
  6. a--
  7. a--

关系运算符

用于对2个值进行比较的运算符, 比较结果为真(True) 或者 假(False)

  • == 判断两个值是否相等
  • != 判断两个值是否不相等
  • 左边值是否大于右边值

  • = 左边值是否大于等于右边值

  • < 左边值是否小于右边值
  • <= 左边值是否小于等于右边值
  1. a, b := 10, 20
  2. a > b
  3. a >= b
  4. a < b

常见的用法是用于条件语句: 我们进行一个a b 的简单排序

  1. a, b := 20, 10
  2. if a > b {
  3. a, b = b, a
  4. }

逻辑运算符

用于对布尔表达式进行逻辑计算, 有如下3种:

  • && 与(ADD), 如果两边的操作数都是 True,则条件 True,否则为 False。
  • || 或(OR), 如果两边的操作数有一个 True,则条件 True,否则为 False
  • ! 非(NOT), 如果条件为 True,则逻辑 NOT 条件 False,否则为 True
  1. age := 90
  2. gender := "male"
  3. if age > 80 && gender == "male" {
  4. fmt.Println("old boy")
  5. } else {
  6. fmt.Println("too young,too simple")
  7. }

位运算符

位运算符对整数在内存中的二进制位进行操作, 运算符有:

  • & 按位与, 参与运算的两数各对应的二进位相与 当两对应的二进位, 都为1时, 结果为1
  • | 按位或, 参与运算的两数各对应的二进位相或, 当两对应的二进位, 有1方为1,结果为1
  • ^ 按位异或, 参与运算的两数各对应的二进位相异或, 当两对应的二进位相异时,结果为1
  • 左移 高位丢弃,低位补0, 左移n位就是乘以2的n次方
  • 右移 高位丢弃,低位补0, 移n位就是除以2的n次方
  1. var (
  2. a uint = 60 // 0011 1100 2^5 + 2^4 + 2^3 + 2^2
  3. b uint = 85 // 0101 0101 2^6 + 2^4 + 2^2 + 2^0
  4. )
  5. fmt.Println("a & b = %d", a&b) // 0001 0100 2^4 + 2^2
  6. fmt.Println("a | b = %d", a|b) // 0111 1101 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^0
  7. fmt.Println("a ^ b = %d", a^b) // 0110 1001 2^6 + 2^5 + 2^3 + 2^0
  8. fmt.Println("a >> 2 = %d", a>>2) // 0000 1111 15
  9. fmt.Println("a << 2 = %d", a<<2) // 1111 0000 240

常用与协议定义, 比如一个byte 8位

  1. 0000 0000
  2. --
  3. 标识性别: 00: 未知, 01: 10: 11: 保留
  4. --
  5. 保留
  6. ----
  7. 标识城市: 0000: 未知, 0001: A, 0010: B

byte 0x17 表示什么? (十进制: 23, 二进制: 0001 0111)

赋值运算符

最基本用法:

  • = 简单的赋值运算符,将一个表达式的值赋给一个左值
  1. a := 10 // 把10赋值给变量a
  • += 相加后再赋值
  • -= 相减后再赋值
  • *= 相乘后再赋值
  • /= 相除后再赋值
  • %= 求余后再赋值
  • <<= 左移后赋值
  • = 右移后赋值

  • &= 按位与后赋值
  • |= 按位异或后赋值
  • ^= 按位或后赋值
  1. a := 10
  2. a += 5 // a = a + 5

其他运算符

  • & 返回变量存储地址
    • 取出地址对应的值
  1. a := 10
  2. b := &a
  3. *b += 5