go blog 学习笔记
The Go Memory Model
Reads and writes of values larger than a single machine word behave as multiple machine-word-sized operations in an unspecified order.
读写大于一个机器字的数据会表现为对多个机器字大小的数据进行不确定执行顺序的操作.
编译器存在重排的可能,多核执行也存在乱序的执行, 所以, 针对如下的语句可能出现b先被赋值的情况, 如果并发读取a,b的值可能会出现不同的效果.
1 | a = 1 |
文章最后给出了一个解决办法: 任何时候都使用显示的同步, 去控制数据的变化.
Errors are values
Error也是一种数据, 对于复杂的错误返回或者多次执行的错误返回, 可通过定义一个包含Err 属性的返回对象, 其定义了error字段, 以便在执行逻辑的最后读取该字段来获取是否发生了error.
在1.13以后go中通过添加了error的IS AS, Unwrap来扩展error的对于嵌套场景的使用.
Working with Errors in Go 1.13