## 1 概述
Go语言提供了,算术,关系,逻辑,位,指针,赋值运算符。本篇整体说明一下。

## 2 算术运算

* \+ 相加
* \- 相减
* \* 相乘
* / 相除
* % 求余
* ++ 自增
* \-\- 自减

几个细节,需要留意一下。
* 整数与浮点数进行运算,会将整数转化为浮点数,再运算。
* 两个整数相除,结果是整数,取整数部分。5/3 结果会是 1。
* 求余,如果被除数或除数存在负数,那么余数与被除数保持一致。此处是求余不是取模。
* ++/--,不区分前后,只有变量后的语法,就是 v++。同时++/--构成语句而不是表达式,意味着不能直接赋值。

## 3 字符串连接运算 +
+运算符,也可以完成字符串的连接运算。
```
"Hello" + " " + "Hank!"
```

## 4 关系运算

* == 检查两个值是否相等
* != 检查两个值是否不相等
* \> 检查左边值是否大于右边值
* < 检查左边值是否小于右边值
* \>= 检查左边值是否大于等于右边值
* <= 检查左边值是否小于等于右边值

关系运算时用于判断两个运算数的关系是否成立。返回布尔值。

## 5 逻辑运算

* && 逻辑与,参与运算的两个关系必须同时成立,结果为true,否则为false
* || 逻辑或,参与运算的两个关系成立一个(或都成立)结果为true,全部关系为false,结果为false。
* ! 逻辑非,用于取反某个关系。非真既假,非假既真。只有一个运算数参与运算

用来判断多个关系是否成立。运算结果为:
&&
true && true = true
true && false = false
false && true = false
false && false = false
||
true || true = true
true || false = true
false || true = true
false || false = false
!
!true = false
!false = true

## 6 指针运算

* & 取得变量的内存地址。pv := &v
* \* 获取指针地址对应的值。\*pv
示例为:
```
  v:=42
  pv:=&v
  fmt.Printf("%T(%v)", pv, pv)// *int 0xc000048b68,*int就是指针类型 值为一个类似规则的地址,就是一个号码,标识内存的一个空间区域
  fmt.Println(*pv)// 42,通过地址获取对应的变量值
  *pv ++ // 通过地址更改对应变量
  fmt.Println(*pv, v)// 42 42变量和指针操作的同一变量(内存地址)。
```
Go语言的指针不可以操作。不能执行偏移这类的操作.

理解指针的几个概念:
变量:标识符与值(内存中存储空间)引用。
地址:内存中存储空间的位置(门牌号)
指针:一种类型,其值为某个地址。

一个数据(变量),我们可以通过变量标识符找到他。也可以将他的地址记录下来,通过这个地址找到他。能够记录地址的数据类型就是指针。指针通过&运算符来获取变量的地址。

## 7 位运算

* & 按位与运算
* | 按位或运算
* ^ 按位异或运算
* <<  左移运算符,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。左移n位就是乘以2的n次方。
* \>>  右移运算符,">>"右边的数指定移动的位数,低位舍弃,高位补0。右移n位就是除以2的n次方。

用于运算构成整数的每个二进制位,就是位上0,1的运算。

## 8 赋值运算

* = 简单的赋值运算符,将一个表达式的值赋给一个左值
* +=  相加后再赋值
* -=  相减后再赋值
* \*=  相乘后再赋值
* /=  相除后再赋值
* %=  求余后再赋值
* <<= 左移后赋值
* \>>= 右移后赋值
* &=  按位与后赋值
* ^=  按位异或后赋值
* |=  按位或后赋值

变量 = 表达式
=左边的变量,称之为左值。通常只能是变量。
=右边的表达式,称之为右值。表达式是右值。

自赋值运算,一些运算符,可以与赋值运算符结合,完成快捷自运算赋值,就是上面的+=....|=,逻辑是:
v += 1 相当于 v = v + 1
其他的逻辑相同!

## 9 运算符优先级

由高到低,列表如下:
* ^ !
* \* / % << >> & &^
* \+ - | ^
* == != < <= >= >
* <-
* &&
* ||

建议使用()小括号,明确调整优先级。

## 10 类型转换

类型不同的数据不能完成运算。如果需要,则要将类型转换为一致的类型。
自动转换,有些转换Go语言自动完成,例如 `5/4.0` 5整型会被自动转换为浮点数。
强制转换,使用语法 `type(数据)` 的形式转换,例如:`float64(5)`。

Go语言对类型要求比较严格,类型可以相互转换的场景不多,主要集中在数值上。就是要类型兼容,才可以转换。

完!
原文出自:[小韩说课](http://www.hellokang.net/go/go-operator/)
微信关注:小韩说课
![小韩说课](http://www.hellokang.net/images/wechat_subscription.jpg)

最新文章

  1. Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗
  2. 详解 JavaScript的 call() 和 apply()
  3. django中html过滤器filter
  4. [转载]tlb、tlh和tli文件的关系
  5. ffmpeg-20160811-bin.7z
  6. 9. Linux远程登录
  7. jquery.uploadify 异常 “__flash__removeCallback”未定义
  8. union all 简单用法
  9. 『重构--改善既有代码的设计』读书笔记----Substitute Algorithm
  10. crt连接vitualbox中centos虚拟机
  11. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named &#39;__frch_lableId_0&#39; in &#39;class com.cd.entity.Page&#39;
  12. Windows Message Queue
  13. js获取对象长度和名称
  14. Charles SSL
  15. smb 访问时 提示权限不够
  16. Java容器解析系列(8) Comparable Comparator
  17. Ubuntu上部署tomcat后无法访问8080端口问题
  18. python之路--MySQL数据库初识
  19. Python学习(二十八)—— Django模板系统
  20. Contest2075 - 湖南多校对抗(csu1576)大数 Catalan Square

热门文章

  1. DOS下常用命令
  2. Memory Leak Detection in Embedded Systems
  3. Android Studio添加取消代码注释快捷键
  4. npm创建react项目
  5. 六种排序算法的JavaScript实现以及总结
  6. 「CF375D Tree and Queries」
  7. RabbitMQ之五种消息模型
  8. 陈正冲老师讲c语言之内存的申请malloc() 和释放free()
  9. 数据库——MySQL——索引
  10. php auto_prepend_file和auto_append_file的妙用