Go语言中的运算符用于执行数学计算、逻辑判断、位操作等操作。以下是Go语言中常见运算符的详细分类及代码示例:


1. 算术运算符

用于执行基本的数学计算,包括加法、减法、乘法、除法、取模等。

代码示例:

package main

import "fmt"

func main() {
    a, b := 10, 3

    fmt.Println("加法:", a + b)  // 13
    fmt.Println("减法:", a - b)  // 7
    fmt.Println("乘法:", a * b)  // 30
    fmt.Println("除法(整数):", a / b)  // 3(整数除法)
    fmt.Println("取模:", a % b)  // 1(10 ÷ 3 的余数)

    // 自增和自减
    c := 5
    c++  // c = 6
    fmt.Println("自增后:", c)
    c--  // c = 5
    fmt.Println("自减后:", c)
}

注意事项:

  • 自增(++)和自减(--)只能作为独立语句使用,不能参与其他运算(如 i+++j 是非法的)。
  • 整数除法会截断小数部分(如 10 / 3 结果为 3)。

2. 关系运算符

用于比较两个值的大小或相等性,返回布尔值(true/false)。

代码示例:

package main

import "fmt"

func main() {
    a, b := 10, 20

    fmt.Println("等于:", a == b)     // false
    fmt.Println("不等于:", a != b)   // true
    fmt.Println("大于:", a > b)      // false
    fmt.Println("小于:", a < b)      // true
    fmt.Println("大于等于:", a >= b) // false
    fmt.Println("小于等于:", a <= b) // true
}

注意事项:

  • 只有相同类型的变量才能比较(如 intfloat64 不能直接比较)。
  • 常量比较时需类型兼容(如 12 是整数常量,可以直接比较)。

3. 逻辑运算符

用于组合或反转布尔表达式,包括逻辑与(&&)、逻辑或(||)、逻辑非(!)。

代码示例:

package main

import "fmt"

func main() {
    a, b := true, false

    fmt.Println("逻辑与:", a && b)  // false
    fmt.Println("逻辑或:", a || b)  // true
    fmt.Println("逻辑非:", !a)     // false

    // 短路行为演示
    fmt.Println("短路与:", a && check())  // true && check() 执行 check()
    fmt.Println("短路或:", b || check())  // false || check() 执行 check()
    fmt.Println("短路或:", !b || check())  // false || check() 不执行 check()
}

func check() bool {
    fmt.Println("check() 被调用")
    return true
}

注意事项:

  • &&|| 是短路运算符:a && b 中如果 afalseb 不会被计算;a || b 中如果 atrueb 不会被计算。

4. 位运算符

对整数的二进制位进行操作,包括按位与(&)、按位或(|)、按位异或(^)、左移(<<)、右移(>>)。

代码示例:

package main

import "fmt"

func main() {
    a, b := 5, 3  // 二进制: 101 & 011

    fmt.Println("按位与:", a & b)   // 1 (101 & 011 = 001)
    fmt.Println("按位或:", a | b)   // 7 (101 | 011 = 111)
    fmt.Println("按位异或:", a ^ b) // 6 (101 ^ 011 = 110)
    fmt.Println("左移:", a << 2)    // 20 (101 << 2 = 10100)
    fmt.Println("右移:", a >> 1)    // 2 (101 >> 1 = 10)
}

注意事项:

  • 左移 << n 等价于乘以 $2^n$,右移 >> n 等价于除以 $2^n$(向下取整)。

  • 位运算符仅适用于整数类型。

    why?,位运算符仅适用于整数类型(包括整型和字符型)。原因在于位运算符(如&|^<<>>等)直接操作数据的二进制位,而整数类型在内存中以连续的二进制形式存储,便于逐位处理。字符型数据(如char)本质上存储为整数值(例如ASCII或Unicode码点),因此也能参与位运算,但其本质仍是整数。

    对于其他数据类型:

    • 浮点类型(如floatdouble):因存储格式复杂(包含符号位、指数、尾数等),二进制位不连续且无法直接操作,故不支持位运算。
    • 字符串、布尔值或结构体:二进制表示不统一或非整数形式,无法执行位操作;若强行使用,可能导致类型错误或隐式转换,但严格意义上已超出“适用”范围。

    在实际编程中,位运算常用于权限控制、数据压缩等场景,但始终要求操作数为整数。


5. 赋值运算符

用于将值赋给变量,包括简单赋值(=)和复合赋值运算符(+=, -=, *=, /=, %= 等)。

代码示例:

package main

import "fmt"

func main() {
    a := 10

    a += 5  // 等价于 a = a + 5
    fmt.Println("a += 5:", a)  // 15

    a -= 3  // 等价于 a = a - 3
    fmt.Println("a -= 3:", a)  // 12

    a *= 2  // 等价于 a = a * 2
    fmt.Println("a *= 2:", a)  // 24

    a /= 4  // 等价于 a = a / 4
    fmt.Println("a /= 4:", a)  // 6

    a %= 2  // 等价于 a = a % 2
    fmt.Println("a %= 2:", a)  // 0
}

位运算复合赋值示例:

package main

import "fmt"

func main() {
    x := 5  // 二进制: 0101

    x &= 3  // 0101 & 0011 = 0001 (1)
    fmt.Println("x &= 3:", x)

    x |= 2  // 0001 | 0010 = 0011 (3)
    fmt.Println("x |= 2:", x)

    x ^= 1  // 0011 ^ 0001 = 0010 (2)
    fmt.Println("x ^= 1:", x)

    x <<= 1  // 0010 << 1 = 0100 (4)
    fmt.Println("x <<= 1:", x)

    x >>= 1  // 0100 >> 1 = 0010 (2)
    fmt.Println("x >>= 1:", x)
}

注意事项:

  • 复合赋值运算符简化了重复操作,使代码更简洁。
  • 类型必须兼容(如 intfloat64 不能直接赋值)。

6. 其他运算符

指针运算符:

  • & 获取变量的地址。
  • * 通过指针访问变量的值。

代码示例:

package main

import "fmt"

func main() {
    a := 10
	p := &a                         // 获取变量a的地址
	fmt.Println("变量a的地址:", p)    //变量a的地址: 0xc00000a220
	fmt.Println("通过指针访问值:", *p) //通过指针访问值: 10

	*p = 20                      // 修改指针指向的值
	fmt.Println("修改后的a值:", a) //修改后的a值: 20
}

7. 运算符优先级

Go语言的运算符优先级从高到低如下:

  1. ^!*/%+-<<>>&&^
  2. ==!=<<=>>=
  3. &&
  4. ||

代码示例:

package main

import "fmt"

func main() {
    result := 5 + 3*2       // 5 + (3*2) = 11
    fmt.Println("运算符优先级:", result)

    result = (5 + 3) * 2    // (5+3)*2 = 16
    fmt.Println("带括号的优先级:", result)
}

8.总结

  • 算术运算符:用于基本数学计算,注意整数除法的截断行为。
  • 关系运算符:比较值的大小或相等性,返回布尔值。
  • 逻辑运算符:组合布尔表达式,利用短路行为优化性能。
  • 位运算符:对二进制位进行操作,常用于底层开发。
  • 赋值运算符:简化变量更新操作,支持复合赋值。
  • 其他运算符:如指针运算符,用于内存操作。