重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
学完了 net/http 和 fasthttp 两个HTTP协议接口的客户端实现,接下来就要开始Server的开发,不学不知道一学吓一跳,居然这两个库还支持Server的开发,太方便了。
目前创新互联公司已为成百上千的企业提供了网站建设、域名、虚拟空间、网站托管运营、企业网站设计、两当网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
相比于Java的HTTPServer开发基本上都是使用Spring或者Springboot框架,总是要配置各种配置类,各种 handle 对象。Golang的Server开发显得非常简单,就是因为特别简单,或者说没有形成特别统一的规范或者框架,我发现了很多实现方式,HTTP协议基于还是 net/http 和 fasthttp ,但是 handle 语法就多种多样了。
先复习一下: Golang语言HTTP客户端实践 、 Golang fasthttp实践 。
在Golang语言方面,实现某个功能的库可能会比较多,有机会还是要多跟同行交流,指不定就发现了更好用的库。下面我分享我学到的六种Server开发的实现Demo。
基于 net/http 实现,这是一种比较基础的,对于接口和 handle 映射关系处理并不优雅,不推荐使用。
第二种也是基于 net/http ,这种编写语法可以很好地解决第一种的问题,handle和path有了类似配置的语法,可读性提高了很多。
第三个基于 net/http 和 github.com/labstack/echo ,后者主要提供了 Echo 对象用来处理各类配置包括接口和handle映射,功能很丰富,可读性最佳。
第四种依然基于 net/http 实现,引入了 github.com/gin-gonic/gin 的路由,看起来接口和 handle 映射关系比较明晰了。
第五种基于 fasthttp 开发,使用都是 fasthttp 提供的API,可读性尚可,handle配置倒是更像Java了。
第六种依然基于 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有点奇怪两个居然不在一个GitHub仓库里。使用语法跟第三种方式有点类似,比较有条理,有利于阅读。
Python:
难度系数:一颗星;欢迎指数:四颗星。
学完之后可以从事:web开发、应用开发、大数据、数据挖掘、科学计算、机器学习、人工智能、运维、自然语言处理等。
就业薪资:北京地区Python开发工程师,工资收入水平应届毕业生起步10k左右。
GO语言:
难度指数:一颗星;欢迎指数:四颗星
相对于来讲,GO语言并不是很难。但是GO语言的学习资料相对于其他语言比较少,所以学习起来没有其他语言那么便利;很多人都说GO语言很火,按照数据来讲是的,尤其是在国外,GO语言非常火,有很好的开发效率,主要用于服务器端的开发,进行处理日志、数据打包、虚拟机处理、文件系统等。
就业薪资:GO语言起步薪资相对于较低,而且招聘岗位也不是很多。
Java:
难度指数:三颗星;欢迎指数五颗星。
Java可以做:安卓和IOS的应用开发、视频游戏开发、桌面GUI、软件开发等。
就业薪资:Java属于老牌编程语言,但是由于市场上开发人员较多,竞争激烈,薪资比较平稳,招聘需求量也不是很高,如果是应届毕业生的话,可能并不是很好找工作。
C++:
难度指数:四颗星;欢迎指数:四颗星。
C++目前被看作编写大型程序时应用最好的面向对象编程语言,C++是C语言的升级版本。
C++可以做:搜索引擎、软件开发、操作系统、视频游戏等。
就业薪资:C++开发工程师起薪工资一万左右,高级工程师薪资两万左右,但是学习起来不易,对基础、学历都有要求。
综合情况,从难易度、就业薪资、需求量方面来讲,更推荐大家学习Python。Python简单易学、容易入门、语法清晰,对初学者十分友好。
sync.Map是1.9才推荐的并发安全的map,除了互斥量以外,还运用了原子操作,所以在这之前,有必要了解下 Go语言——原子操作
go1.10\src\sync\map.go
entry分为三种情况:
从read中读取key,如果key存在就tryStore。
注意这里开始需要加锁,因为需要操作dirty。
条目在read中,首先取消标记,然后将条目保存到dirty里。(因为标记的数据不在dirty里)
最后原子保存value到条目里面,这里注意read和dirty都有条目。
总结一下Store:
这里可以看到dirty保存了数据的修改,除非可以直接原子更新read,继续保持read clean。
有了之前的经验,可以猜测下load流程:
与猜测的 区别 :
由于数据保存两份,所以删除考虑:
先看第二种情况。加锁直接删除dirty数据。思考下貌似没什么问题,本身就是脏数据。
第一种和第三种情况唯一的区别就是条目是否被标记。标记代表删除,所以直接返回。否则CAS操作置为nil。这里总感觉少点什么,因为条目其实还是存在的,虽然指针nil。
看了一圈貌似没找到标记的逻辑,因为删除只是将他变成nil。
之前以为这个逻辑就是简单的将为标记的条目拷贝给dirty,现在看来大有文章。
p == nil,说明条目已经被delete了,CAS将他置为标记删除。然后这个条目就不会保存在dirty里面。
这里其实就跟miss逻辑串起来了,因为miss达到阈值之后,dirty会全量变成read,也就是说标记删除在这一步最终删除。这个还是很巧妙的。
真正的删除逻辑:
很绕。。。。