Go语言之运算符
Golang 运算符主要有算术运算符、赋值运算符、比较运算符/关系运算符、逻辑运算符、位运算符和指针运算符
一、算术运算符
算术运算符是对 数值类型 的变量进行运算的,比如:加、减、乘、除和取模
| 运算符 | 说明 | 示例 | 结果 |
| + | 正号 | +3 | 3 |
| – | 负号 | -1 | -1 |
| + | 加法运算 | 2+5 | 7 |
| – | 减法运算 | 9-5 | 4 |
| * | 乘法运算 | 8*3 | 24 |
| / | 除法运算 | 10/3 | 3 |
| % | 取模运算 | 10%3 | 1 |
| ++ | 自增运算 | a = 5; a++ | 6 |
| — | 自减运算(两个-) | a = 8; a– | 7 |
| + | 字符串拼接 | “hello” + “world” | “helloworld” |
注:除法运算 /,如果是整数之间做除法运算时,只保留整数部分而舍弃小数部分,Golang 中的自增运算和自减运算只能当做一个独立语句使用,Golang 中只支持后自增和后自减
1、下面例子通过算数运算符进行计算,如图:

运行结果如下:

二、赋值运算符
赋值运算符是对已存在的 变量 进行重新设置新值的运算符
十进制运算:
| 运算符 | 说明 | 示例 | 结果 |
| = | 将一个表达式的值赋给另一个 | a=a+b | a=a+b |
| += | 相加后再赋值 | a+=b | a=a+b |
| -= | 相减后再赋值 | a-=b | a=a-b |
| *= | 相乘后再赋值 | a*=b | a=a*b |
| /= | 求余后再赋值 | a/=b | a=a/b |
| %= | 相除后再赋值 | a%=b | a=a%b |
二进制运算符:
| 运算符 | 说明 | 示例 | 结果 |
| <<= | 左移后赋值 | a<<=b | a=a<<b |
| >>= | 右移后赋值 | a>>=b | a=a>>b |
| &= | 按位与后赋值 | a&=b | a=a&b |
| ^= | 按位异或后赋值 | a^=b | a=a^b |
| |= | 按位或后赋值 | a |= b | a = a | b |
1、下面通过十进制运算实现赋值运算符,如图:

运行结果如下:

2、通过左移右移赋值,如图:

运行结果如下:

从上图看出,将a左移两位后赋值给a,此时a的值变为40,为什么是40呢?因为a左移1位相当于a*2的1次方,a左移2位就是a * 2的2次方,也就是10 * 2的2次方,10*4=40,同理,b向右移1位相当于b / 2的1次方,右移2位就是b/2的2次方,因此实际结果为b / 2的3次方,b的值为5,就是5/2的3次方=5/8结果为0
注:2的-1次方结果为1/2、2的-2次方结果为1/4、2的-3次方结果为1/8,以此类推
3、通过按位与、异或、或实现赋值:


(1) a&=5的值为什么是4?
按位与是将十进制数转换为二进制数之后进行按位操作,30的十进制数是11110,5的十进制数为00101,&的运算法则是:两个操作数的二进制表示,只有对应位置都是1,结果才是1,否则为0,因此11110和00101进行&后的内容为00100,结果为4
(2) b^=4 的值为什么是24?
按位异或也需要将十进制转为二进制后进行操作,运算法则是:当两个操作数的二进制表示相同(同为0或者同为1) 时,结果为0,否则为1,28的二进制数为11100,4的二进制为00100,根据运算法则,进行按位异或后的值二进制为11000,转换为十进制就是24
(3) c |=3 的值为什么是15?
按位或也需要将十进制转为二进制后进行操作,运算法则是:两个操作数的二进制表示,只有对应位置都是0,结果才是0,否则位置1,15的二进制为1111,3的二进制为0011,因此按位或后的结果为1111,转换为十进制就是15
三、比较运算符
比较运算符(关系运算符)的结果都是 bool 型,也就是要么是 true,要么是 false。关系表达式经常用在 if 结构的条件中或 循环结构 的条件中
| 运算符 | 说明 | 示例 | 结果 |
| == | 相等 | 3 == 3 | true |
| != | 不等于 | 2 != 2 | false |
| < | 小于 | 2 < 5 | false |
| > | 大于 | 3 > 1 | true |
| <= | 小于等于 | 3 <= 8 | true |
| >= | 大于等于 | 5 >= 6 | false |
1、下面例子表示利用比较运算符进行计算,如图:


在golang中,可以直接将float64和int进行比较,golang内部会自行转换类型
2、下面例子从键盘获取一个整数或者浮点数,并与50进行比较,如图:

说明:从键盘输入后,读取的内容实际是字符串类型,因此在去除\n后,还需要将此字符串类型转换为float64类型,然后在与50进行比较,运行程序,分别输入三个数,结果如图:

注意看:输入25.890后,实际输出只有25.89,因为在golang中,如果浮点数最后一个为0,并且该位之后没有非零数字,那么可以被省略这是由于 IEEE 754 浮点数标准的舍入规则所决定的
3、也可以使用==来比较字符串,如图:


四、逻辑运算符
逻辑运算符是用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个 bool 值
| 运算符 | 说明 | 示例 |
| && | 逻辑与 | a && b |
| || | 逻辑或 | a || b |
| ! | 逻辑非 | !a |
- 逻辑与:如果 a 和 b 的值都为真,那么结果为真,否则结果为假。如果 a 的值为假,那么不会计算 b 的值
- 逻辑或:只要 a和 b的值一个为真,那么结果为真,否则结果为假。如果 a 的值为真,那么不会计算 b的值
- 逻辑非:如果原来 a的值为真,那么结果为假。如果原来 a 的值为假,那么结果为真
1、下面例子表示逻辑运算符进行计算,如图:

运算结果如下:

2、如果同一个变量要判断多次,可以通过括号连接,如图:

上图中我们判断变量a,并且要同时满足变量a和变量b,变量b又要同时满足两个条件,此时可用括号将变量a与b进行连接,运行结果如下:

五、位运算符
上面中的模块已经讲解过了,主要就是&、|、^、<<、>>等
六、指针运算符
指针运算符主要包括取地址运算符 & 和 取值运算符 *
| 运算符 | 说明 | 示例 |
| & | 返回变量的内存地址 | &a |
| * | 获取指针变量对应的值 | *a |
下面例子表示使用指针运算进行计算,如图:


七、运算符优先级
运算符的运算规则是,优先级高的运算符先执行,优先级低的运算符后执行,同一优先级的运算符按照从左到右的顺序进行,Go 语言中大部分运算符都是从左向右执行的,只有单目运算符、赋值运算符它们是从右向左执行的
Go 语言运算符中,如果有小括号,即 (),则小括号的优先级最高
优先级表如下:优先级值越大,优先级越高
| 优先级 | 分类 | 运算符 | 结合性 |
| 1 | 逗号运算符 | , | 从左到右 |
| 2 | 赋值运算符 | =、+=、-=、*=、/=、 %=、 >=、 <<=、&=、^=、|= | 从右到左 |
| 3 | 逻辑或 | || | 从左到右 |
| 4 | 逻辑与 | && | 从左到右 |
| 5 | 按位或 | | | 从左到右 |
| 6 | 按位异或 | ^ | 从左到右 |
| 7 | 按位与 | & | 从左到右 |
| 8 | 相等/不等 | ==、!= | 从左到右 |
| 9 | 关系运算符 | <、<=、>、>= | 从左到右 |
| 10 | 位移运算符 | <<、>> | 从左到右 |
| 11 | 加法/减法 | +、- | 从左到右 |
| 12 | 乘法/除法/取余 | *(乘号)、/、% | 从左到右 |
| 13 | 单目运算符 | !、*(指针)、& 、++、–、+(正号)、-(负号) | 从右到左 |
| 14 | 后缀运算符 | ( )、[ ]、-> | 从左到右 |


