接着昨天的说,今天主要就是并发安全、锁以及两个简单的web例子


1.并发安全和锁


既然涉及到安全,那就要说说为什么会不安全。昨天说了goroutine的并发,那么如果多个goroutine在没有互相同步的时候同时访问某个资源,并且进行i/o操作,那这个时候我们就叫它们处于竞争状态,简称就是竞态。下面来看个竞态的例子



image.png

分析一下,明明用了两个goroutine,并且每个goroutine都会执行两次,结果不应该是4吗?为什么是2。这个时候就涉及到竞态了,也就是每个goroutine会覆盖其他goroutine的操作,所以就出现了错误。这个时候锁的重要性就体现出来了,当然我们也可以运用原子函数来消除竞态的影响,但是它只支持几种内置基本数据类型,所以锁还是最为关键的。最常用的就是互斥锁(mutex),它可以保证同一时间只有一个goroutine可以访问这个资源,再用mutex来修改上面的代码看看效果。



加上一个mutex后的结果


image.png

这样就正常了,所以互斥锁可以很好的防止竞态问题。当一个读的操作远远大于写操作的时候,用单纯的互斥锁是不是就很浪费,这时候还有个读写互斥锁



用这个例子会发现在读的次数远远大于写的次数的情况下,使用读写互斥锁的速度会比用互斥锁快很多。


2.web的例子


1.web中的"HELLO WORLD"



代码很简单,就是把你设置的端口启动web服务,然后打印hello world以及端口后的网址信息


image.png

2.一个简单的服务器端与客户端的通信服务器端



客户端



运行结果:


image.png

其实web开发主要还是要用框架,像python的flask,django……java的ssm,ssh……所以go语言搞web的话也是要用框架的,所以最近也会去学学关于gin的知识。