Go 运算符
运算符是一个符号,告诉编译器执行特定的数学或逻辑操作。 Go语言具有丰富的内置运算符,并提供以下类型的运算符:
算术运算符
关系运算符
逻辑运算符
按位运算符
赋值运算符
杂项运算符
本教程逐一说明算术、关系、逻辑、按位、赋值和其他运算符。
算术运算符
下表显示了Go语言支持的所有算术运算符。假设变量A等于10,变量B等于20:
运算符 | 描述 | 例子 |
---|---|---|
+ | 加两个操作数 | A + B等于30 |
- | 从第一个减去第二个操作数 | A-B等于-10 |
* | 将两个操作数相乘 | A * B等于200 |
/ | 分子除以分母。 | B / A等于2 |
% | 模运算符;给出整数除法后的余数。 | B%A等于0 |
++ | 增量运算符。它将整数值增加一。 | A ++等于11 |
-- | 递减运算符。它将整数值减一。 | A--等于9 |
关系运算符
下表列出了Go语言支持的所有关系运算符。假设变量A等于10,变量B等于20,则:
运算符 | 描述 | 例子 |
---|---|---|
== | 它检查两个操作数的值是否相等。如果是,则条件为真。 | (A == B)为假。 |
!= | 它检查两个操作数的值是否相等。如果值不相等,则条件为真。 | (A!= B)为真。 |
> | 它检查左操作数的值是否大于右操作数的值;如果是,则条件为真。 | (A> B)为假。 |
< | 它检查左操作数的值是否小于右操作数的值;如果是,则条件为真。 | (A <B)为真。 |
>= | 它检查左操作数的值是否大于或等于右操作数的值;如果是,则条件为真。 | (A> = B)为假。 |
<= | 它检查左操作数的值是否小于或等于右操作数的值;如果是,则条件为真。 | (A <= B)为真。 |
逻辑运算符
下表列出了Go语言支持的所有逻辑运算符。假设变量A等于1和变量B等于0,则:
运算符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑AND运算符。如果两个操作数都不为零,则条件为true。 | (A && B)是错误的。 |
|| | 称为逻辑或运算符。如果两个操作数中的任何一个都不为零,则条件为true。 | (A || B)为真。 |
! | 称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑非运算符将为假。 | !(A && B)是正确的。 |
下表显示了Go语言支持的所有逻辑运算符。假设变量A为真和变量B为假,则:
运算符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑AND运算符。如果两个操作数都为假,则条件变为假。 | (A && B)是错误的。 |
|| | 称为逻辑或运算符。如果两个操作数中的任何一个为true,则条件为true。 | (A || B)为真。 |
! | 称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑非运算符会将其设置为假。 | !(A && B)是正确的。 |
按位运算符
按位运算符对位进行运算并执行逐位运算。 &,|和^的真值表如下:
p | q | p&q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假设A = 60;并且B =13。以二进制格式,它们将如下所示:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
〜A = 1100 0011
下表列出了C语言支持的按位运算符。假设变量A等于60,变量B等于13,则:
运算符 | 描述 | 例子 |
---|---|---|
& | 如果两个操作数中都存在二进制AND运算符,则会将一位复制到结果中。 | (A&B)将得到12,即0000 1100 |
| | 如果任一操作数中存在二进制或运算符,则会对其进行复制。 | (A | B)将得到61,即0011 1101 |
^ | 二进制XOR运算符将复制该位(如果在一个操作数中但不是在两个操作数中都将其置1)。 | (A ^ B)将得到49,即0011 0001 |
<< | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 | << 2将得到240,即1111 0000 |
>> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 | A >> 2将得到15,即0000 1111 |
赋值运算符
下表列出了Go语言支持的所有赋值运算符:
运算符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将值从右侧操作数分配到左侧操作数 | C = A + B将A + B的值赋给C |
+= | 添加AND赋值运算符,它将右操作数添加到左操作数,并将结果分配给左操作数 | C + = A等效于C = C + A |
-= | 减去AND赋值运算符,它从左边的操作数中减去右边的操作数,并将结果赋给左边的操作数 | C-= A等效于C = C-A |
*= | 将AND赋值运算符相乘,将右操作数与左操作数相乘并将结果分配给左操作数 | C * = A等效于C = C * A |
/= | 除法AND赋值运算符,它将左操作数除以右操作数,并将结果分配给左操作数 | C / = A等效于C = C / A |
%= | 模AND赋值运算符,它使用两个操作数取模并将结果赋给左操作数 | C%= A等效于C = C%A |
<< = | 左移AND赋值运算符 | C << = 2与C = C << 2相同 |
>> = | 右移和赋值运算符 | C >> = 2与C = C >> 2相同 |
&= | 按位与赋值运算符 | C&= 2与C = C&2相同 |
^= | 按位异或与赋值运算符 | C ^ = 2与C = C ^ 2相同 |
|= | 按位或运算符和赋值运算符 | C | = 2与C = C |2 相同 |
杂项运算符
Go语言还支持其他一些重要的运算符,包括 sizeof 和 ? : 。
运算符 | 描述 | 例子 |
---|---|---|
& | 返回变量的地址。 | &一种;提供变量的实际地址。 |
* | 指向变量的指针。 | *一种;提供指向变量的指针。 |
Go中的运算符优先级
运算符优先级确定表达式中术语的分组。这会影响表达式的求值方式。某些运算符的优先级高于其他运算符;例如,乘法运算符的优先级高于加法运算符。
例如x = 7 + 3 * 2;在这里,x被赋值为13,而不是20,因为运算符*的优先级比+高,因此它首先与3 * 2相乘,然后加到7。
在此,优先级最高的运算符出现在表格的顶部,而优先级最低的运算符出现在表格的底部。在表达式中,优先级较高的运算符将首先被评估。
类别 | 运算符 | 关联性 |
---|---|---|
前缀 | ()[]->。 ++-- | 左到右 |
一元 | +-! 〜++--(type)*&sizeof | 右到左 |
乘除 | * / % | 左到右 |
加减 | + - | 左到右 |
移位 | << >> | 左到右 |
关系型 | < | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | || | 左到右 |
赋值 | = + =-= * = / =%= >> = << =&= ^ = | = | 右到左 |
逗号 | , | 左到右 |