算数运算符
算数运算符与其他语言基本没有太多的不同。
Note: 此处 A = 10,B = 20
运算符 | 描述 | 实例 |
---|---|---|
+ | 相加 | A + B = 30 |
- | 相减 | A - B = -10 |
* | 相乘 | A * B = 200 |
/ | 相除 | B / A = 2 |
% | 求余 | B % A = 0 |
++ | 自增 | A++ = 11 |
-- | 自减 | A-- = 9 |
提示: Go 语言没有前置的 ++ 或 --
比较运算符
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个值是否相等,相等返回 True 否则返回 False | A == B 为 False |
!= | 检查两个值是否不相等,不相等返回 True 否则返回 False | A != B 为 True |
> | 检查左边值是否大于右边值,是返回 True 否则返回 False | A > B 为 False |
< | 检查左边值是否小于右边值,是返回 True 否则返回 False | A < B 为 True |
>= | 检查左边值是否大于或等于右边值,是返回 True 否则返回 False | A >= B 为 False |
<= | 检查左边值是否小于或等于右边值,是返回 True 否则返回 False | A <= B 为 True |
用 == 比较数组
- 相同维数且含有相同个数元素的数组才可以比较
- 每个元素都相同的才相等
在其他的编程语言中,数组一般都是引用类型,数组之间的比较最终都是引用类型的比较,而不是比较里面的值是否相同。
测试实例 1
package operator_test
import "testing"
func TestCompareArray(t *testing.T) {
a := [...]int{1, 2, 3, 4}
b := [...]int{1, 3, 4, 5}
c := [...]int{1, 2, 3, 4, 5}
d := [...]int{1, 2, 3, 4}
t.Log(a == b) // 输出:false
t.Log(a == c) // 编译错误:invalid operation: a == c (mismatched types [4]int and [5]int)
t.Log(a == d) // 输出:false
}
逻辑运算符
运算符 | 描述 | 实例 |
---|---|---|
&& | 逻辑 AND 运算符。如果两边操作数都为 True,则条件 True,否则 False | A && B = False |
|| | 逻辑 OR 运算符。如果两边操作数有一个 True,则条件 True,否则 False | A || B = True |
! | 逻辑 NOT 运算符。如果条件为 True,则逻辑 NOT 条件为 False,否则False | !(A && B) = True |
位运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 参与运算的两数各对应的二进制位相与 | A & B = 12 |
| | 参与运算的两数各对应的二进位相或 | A | B = 61 |
^ | 参与运算的两数各对应的二进位相异或 | A ^ B = 49 |
<< | 左移 n 位就是乘以 2 的 n 次方 | A << 2 = 240 |
>> | 右移 n 位就是除以 2 的 n 次方 | A >> 2 = 15 |
与其他主要编程语言差异
Go 语言为了提高生产力,提供了 &^
按位置 0 运算符
如果右边的对应的位数位1,那么不管左边对应的位数是0还是1都清零
如果右边的对应的位数位0,那么结果与左边对应的位数一致。
1 &^ 0 = 1
1 &^ 1 = 0
0 &^ 1 = 0
0 &^ 0 = 0
测试实例 2
package operator_test
import "testing"
const (
Readable = 1 << iota
Writeable
Executable
)
func TestBitClear(t *testing.T) {
// 7 -> 0111
a := 7
a = a &^ Readable // 0111 &^ 0001 -> 0110
a = a &^ Executable // 0110 &^ 0100 -> 0010
t.Log(a&Readable == Readable, a&Writeable == Writeable, a&Executable == Executable)
}