第一个,先说说GO原子性操作的问题,直接上demo(https://gist.github.com/Barbery/08973672e132d5edfe44):

从结果可以看出,在并发编程下,常规的i++运算是不能保证原子性执行的,i++ 这样的运算会被go编译成 i = i + 1来执行,就是先读取i的值然后再加1,而go没有对share memory的操作,没有做thread safe,所以导致运算过程中读取到的i不是最新的情况,要解决这个问题有:

1.加锁(可以去掉demo中的注释代码试试)

2.调用atomic包来保证操作的原子性

 

第二个,就是GO和PHP的不同,GO不但作为一门后端语言,还接管了服务器,可以理解为GO是PHP+NGINX的合体。。。这样性能可以得到非常好的提升,但是也会出现不少问题。。。由于GO是常驻后台运行的,不像PHP那样通过fastcgi协议来访问,这样的区别就导致了GO中的包内/全局变量不会因为每次请求结束而销毁,导致GO的包内/全局变量就像PHP的session那样,如果同时有2个请求进来,任意一个请求改变了包内/全局变量的值都会影响另外一个请求中的值(实际上他们访问的是一个地址中的值,这和PHP很不同)。。。

目前的解决办法是写成OOP的风格去做,这样做的优点是,代码上比较优雅,让每个线程调用包的时候都new一个struct对象,把全局变量包裹到struct里面,让过期是struct对象交给go的垃圾回收去处理。

demo:(https://gist.github.com/Barbery/173f4f3dcdfbfcc366d4)

通过这样,在并发和不同线程的执行中的操作,都不会对其他线程的信息造成污染。