golang-基础-Go语言运算符号
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
}
注意事项:
- 只有相同类型的变量才能比较(如
int
和float64
不能直接比较)。 - 常量比较时需类型兼容(如
1
和2
是整数常量,可以直接比较)。
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
中如果a
为false
,b
不会被计算;a || b
中如果a
为true
,b
不会被计算。
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码点),因此也能参与位运算,但其本质仍是整数。对于其他数据类型:
- 浮点类型(如
float
、double
):因存储格式复杂(包含符号位、指数、尾数等),二进制位不连续且无法直接操作,故不支持位运算。 - 字符串、布尔值或结构体:二进制表示不统一或非整数形式,无法执行位操作;若强行使用,可能导致类型错误或隐式转换,但严格意义上已超出“适用”范围。
在实际编程中,位运算常用于权限控制、数据压缩等场景,但始终要求操作数为整数。
- 浮点类型(如
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)
}
注意事项:
- 复合赋值运算符简化了重复操作,使代码更简洁。
- 类型必须兼容(如
int
和float64
不能直接赋值)。
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语言的运算符优先级从高到低如下:
^
、!
、*
、/
、%
、+
、-
、<<
、>>
、&
、&^
==
、!=
、<
、<=
、>
、>=
&&
||
代码示例:
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.总结
- 算术运算符:用于基本数学计算,注意整数除法的截断行为。
- 关系运算符:比较值的大小或相等性,返回布尔值。
- 逻辑运算符:组合布尔表达式,利用短路行为优化性能。
- 位运算符:对二进制位进行操作,常用于底层开发。
- 赋值运算符:简化变量更新操作,支持复合赋值。
- 其他运算符:如指针运算符,用于内存操作。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果