[TOC]
# 运算符
* 算术运算符
* 关系运算符
* 逻辑运算符
* 位运算符
* 赋值运算符
* 其他运算符
## 算术运算符
| 运算符 | 描述 |
| --- | --- |
| + | 相加 |
| \- | 相减 |
| \* | 相乘 |
| / | 相除 |
| % | 求余 |
**注意:**`++`(自增)和`--`(自减)在Go语言中是单独的语句,并不是运算符。
## 关系运算符
| 运算符 | 描述 |
| --- | --- |
| \== | 检查两个值是否相等,如果相等返回 True 否则返回 False。 |
| != | 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 |
| \> | 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 |
| \>= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 |
| < | 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 |
| <= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 |
## 逻辑运算符
| 运算符 | 描述 |
| --- | --- |
| && | 逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False。 |
| \|\| | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则为 True,否则为 False。 |
| ! | 逻辑 NOT 运算符。 如果条件为 True,则为 False,否则为 True。 |
## 位运算符
| 运算符 | 描述 |
| --- | --- |
| & | 参与运算的两数各对应的二进位相与。 (两位均为1才为1) |
| \| | 参与运算的两数各对应的二进位相或。 (两位有一个为1就为1) |
| ^ | 参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (两位不一样则为1) |
| << | 左移n位就是乘以2的n次方。 “a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。 |
| \>> | 右移n位就是除以2的n次方。 “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 |
~~~
packagemain
import"fmt"
funcmain(){
var auint=60 /* 60 = 0011 1100 */
var buint=13 /* 13 = 0000 1101 */
var cuint=0
c=a & b /* 12 = 0000 1100 */
fmt.Printf("第一行 - c 的值为 %d\n",c)
//第一行 - c 的值为 12
c=a|b /* 61 = 0011 1101 */
fmt.Printf("第二行 - c 的值为 %d\n",c)
//第二行 - c 的值为 61
c=a^b /* 49 = 0011 0001 */
fmt.Printf("第三行 - c 的值为 %d\n",c)
//第三行 - c 的值为 49
c=a <<2 /* 240 = 1111 0000 */
fmt.Printf("第四行 - c 的值为 %d\n",c)
//第四行 - c 的值为 240
c=a >>2 /* 15 = 0000 1111 */
fmt.Printf("第五行 - c 的值为 %d\n",c)
//第五行 - c 的值为 15
}
~~~
## 赋值运算符
| 运算符 | 描述 | 实例 |
| --- | --- | --- |
| \= | 简单的赋值运算符,将一个表达式的值赋给一个左值 | C = A + B 将 A + B 表达式结果赋值给 C |
| += | 相加后再赋值 | C += A 等于 C = C + A |
| \-= | 相减后再赋值 | C -= A 等于 C = C - A |
| \*= | 相乘后再赋值 | C \*= A 等于 C = C \* A |
| /= | 相除后再赋值 | C /= A 等于 C = C / A |
| %= | 求余后再赋值 | C %= A 等于 C = C % A |
| <<= | 左移后赋值 | 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 |
~~~
packagemain
import"fmt"
funcmain(){
var aint=21
var cint
c = a
fmt.Printf("第 1 行 - = 运算符实例,c 值为 = %d\n",c)
//第 1 行 - = 运算符实例,c 值为 = 21
c += a
fmt.Printf("第 2 行 - += 运算符实例,c 值为 = %d\n",c)
//第 2 行 - += 运算符实例,c 值为 = 42
c -= a
fmt.Printf("第 3 行 - -= 运算符实例,c 值为 = %d\n",c)
//第 3 行 - -= 运算符实例,c 值为 = 21
c *= a
fmt.Printf("第 4 行 - *= 运算符实例,c 值为 = %d\n",c)
//第 4 行 - *= 运算符实例,c 值为 = 441
c /= a
fmt.Printf("第 5 行 - /= 运算符实例,c 值为 = %d\n",c)
//第 5 行 - /= 运算符实例,c 值为 = 21
c =200;
c <<= 2
fmt.Printf("第 6行 - <<= 运算符实例,c 值为 = %d\n",c)
//第 6行 - <<= 运算符实例,c 值为 = 800
c >>= 2
fmt.Printf("第 7 行 - >>= 运算符实例,c 值为 = %d\n",c)
//第 7 行 - >>= 运算符实例,c 值为 = 200
c &= 2
fmt.Printf("第 8 行 - &= 运算符实例,c 值为 = %d\n",c)
//第 8 行 - &= 运算符实例,c 值为 = 0
c ^= 2
fmt.Printf("第 9 行 - ^= 运算符实例,c 值为 = %d\n",c)
//第 9 行 - ^= 运算符实例,c 值为 = 2
c |= 2
fmt.Printf("第 10 行 - |= 运算符实例,c 值为 = %d\n",c)
//第 10 行 - |= 运算符实例,c 值为 = 2
}
~~~
## 其他运算符
| 运算符 | 描述 | 实例 |
| --- | --- | --- |
| & | 返回变量存储地址 | &a; 将给出变量的实际地址。 |
| \* | 指针变量。 | \*a; 是一个指针变量 |
- Go准备工作
- 依赖管理
- Go基础
- 1、变量和常量
- 2、基本数据类型
- 3、运算符
- 4、流程控制
- 5、数组
- 数组声明和初始化
- 遍历
- 数组是值类型
- 6、切片
- 定义
- slice其他内容
- 7、map
- 8、函数
- 函数基础
- 函数进阶
- 9、指针
- 10、结构体
- 类型别名和自定义类型
- 结构体
- 11、接口
- 12、反射
- 13、并发
- 14、网络编程
- 15、单元测试
- Go常用库/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go优化
- Go问题排查
- Go框架
- 基础知识点的思考
- 面试题
- 八股文
- 操作系统
- 整理一份资料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小点
- 树
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面试题
- 基础
- Map
- Chan
- GC
- GMP
- 并发
- 内存
- 算法
- docker