码农桃花源

其他

走过 2022

“听过很多道理,依然过不好这一生”。每年写年终总结也是。但是审视自己在过去一年的表现依然是必需的。“吾日三省吾身”,更好的当然是每天都有所反思。世间很多事都离不开反馈,写总结就是一个很好的反馈。经历了过去荒诞的一年,对很多事都无可奈何。22
2023年1月2日
其他

Go 语言应用之 template

vlog,请在文章末尾留言,如果留言的人数很多,我就可以“挟留言以令欧神”^_^。大家给力点,可以先去留个言再看后面的内容。在讲技术内容之前呢,再说一下加我好友的方式,很简单,后台回复:加好友。Go
2020年12月3日
其他

喜提 redir contributor

的增删改查,是一次性的行为。整体的架构图:架构图最后我们来看下如何部署到自己的云主机上,我会修改成自己的域名:qcrao.com。当然,redir
2020年11月16日
其他

“���”引发的线上事故

goroutine】https://medium.com/a-journey-with-go/go-how-does-go-stop-the-world-1ffab8bc8846【煎鱼
2020年4月27日
其他

聊聊 g0

很多时候,当我们跟着源码去理解某种事物时,基本上可以认为是以时间顺序展开,这是编年体的逻辑。还有另一种逻辑,纪传体,它以人物为中心编排史事,使得读者更聚焦于某个人物。以一种新的视角,把所有的事情串连起来,令人大呼过瘾。今天我们试着以这样一种逻辑再看
2020年4月3日
其他

Go GC 20 问

的缩写,即万物静止,是指在垃圾回收过程中为了保证实现的正确性、防止无止境的内存增长等问题而不可避免的需要停止赋值器进一步操作对象图的一段过程。在这个过程中整个用户代码被停止或者放缓执行,
2020年1月6日
其他

中台的末路

《企业IT架构转型之道:阿里巴巴中台战略思想与架构实战》在大多数公司,中台部门和基础架构一样,会被当成是包袱而不是财富。可能有些人读到这里会不太爽。我们来看看,科技公司是怎么看待员工的呢?在
2019年9月25日
其他

Golang error 的突围

nil}第一次处理是将错误写进了日志,第二次处理则是将错误返回给上层调用者。而调用者也可能将错误写进日志或是继续返回给上层。这样一来,日志文件中会有很多重复的错误描述,并且在最上层调用者(如
2019年9月18日
其他

深度解密Go语言之scheduler

调试实例分析】https://tonybai.com/2017/11/23/the-simple-analysis-of-goroutine-schedule-examples/【Tony
2019年9月2日
其他

深度解密Go语言之channel

star。项目地址列在了参考资料里。另外,公众号的文章也可以使用微信读书看,体验也非常赞,并且可以放到书架上,每个公众号就是一本书,简直酷炫。闲话最后,一直“吹”了很久的曹大,新书《Go
2019年7月22日
其他

Go 程序是怎样跑起来的

有限状态机的算法,将源代码的字符系列分割成一系列的记号(Token)。记号一般分为这几类:关键字、标识符、字面量(包含数字、字符串)、特殊符号(如加号、等号)。例如,对于如下的代码:slice[i]
2019年7月3日
其他

深度解密Go语言之context

包短小精悍,非常适合新手学习。不论是它的源码还是实际使用,都值得投入时间去学习。这篇文章依然想尝试全面、深入地去研究。文章相比往期而言,整体不长,希望你看完可以有所收获!贴上文章的目录:什么是
2019年6月12日
其他

深度解密Go语言之map

problem”,它的任务是设计一种数据结构用来维护一个集合的数据,并且可以同时对集合进行增删查改的操作。最主要的数据结构有两种:哈希查找表(Hashtable)、
2019年5月22日
自由知乎 自由微博
其他

深度解密Go语言之Slice

倍。•当直接用切片作为函数参数时,可以改变切片的元素,不能改变切片本身;想要改变切片本身,可以将改变后的切片返回,函数调用者接收改变后的切片或者将切片指针作为函数参数。参考资料【码洞《深度解析
2019年4月2日
其他

深入Go的底层,带你走近一群有追求的人

我能带来的帮助,参加活动的人都是想获取一些东西的:知识、经验、见闻等等。但是,我们不能只索取,不付出。因此,可以讲讲你可以提供的帮助。比如我可以联系场地,我会写宣传文章等等,你可以讲出你独特的价值。
2019年3月20日
其他

Golang之轻松化解defer的温柔陷阱

翻译一下:每次defer语句执行的时候,会把函数“压栈”,函数参数会被拷贝下来;当外层函数(非代码块,如一个for循环)退出时,defer函数按照定义的逆序执行;如果defer执行的函数为nil,
2019年2月12日
其他

【原创】“三次握手,四次挥手”你真的懂吗?

记得刚毕业找工作面试的时候,经常会被问到:你知道“3次握手,4次挥手”吗?这时候我会“胸有成竹”地“背诵”前期准备好的“答案”,第一次怎么怎么,第二次……答完就没有下文了,面试官貌似也没有深入下去的意思,深入下去我也不懂,皆大欢喜!作为程序员,要有“刨根问底”的精神。知其然,更要知其所以然。这篇文章希望能抽丝剥茧,还原背后的原理。为了便于整体把握文章,手动加上文章目录:什么是“3次握手,4次挥手”TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如ip地址、端口号等。TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接。TCP服务模型在了解了建立连接、关闭连接的“三次握手和四次挥手”后,我们再来看下TCP相关的东西。一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。一个TCP连接通常分为三个阶段:启动、数据传输、退出(关闭)。当TCP接收到另一端的数据时,它会发送一个确认,但这个确认不会立即发送,一般会延迟一会儿。ACK是累积的,一个确认字节号N的ACK表示所有直到N的字节(不包括N)已经成功被接收了。这样的好处是如果一个ACK丢失,很可能后续的ACK就足以确认前面的报文段了。一个完整的TCP连接是双向和对称的,数据可以在两个方向上平等地流动。给上层应用程序提供一种双工服务。一旦建立了一个连接,这个连接的一个方向上的每个TCP报文段都包含了相反方向上的报文段的一个ACK。序列号的作用是使得一个TCP接收端可丢弃重复的报文段,记录以杂乱次序到达的报文段。因为TCP使用IP来传输报文段,而IP不提供重复消除或者保证次序正确的功能。另一方面,TCP是一个字节流协议,绝不会以杂乱的次序给上层程序发送数据。因此TCP接收端会被迫先保持大序列号的数据不交给应用程序,直到缺失的小序列号的报文段被填满。TCP头部源端口和目的端口在TCP层确定双方进程,序列号表示的是报文段数据中的第一个字节号,ACK表示确认号,该确认号的发送方期待接收的下一个序列号,即最后被成功接收的数据字节序列号加1,这个字段只有在ACK位被启用的时候才有效。当新建一个连接时,从客户端发送到服务端的第一个报文段的SYN位被启用,这称为SYN报文段,这时序列号字段包含了在本次连接的这个方向上要使用的第一个序列号,即初始序列号ISN,之后发送的数据是ISN加1,因此SYN位字段会消耗一个序列号,这意味着使用重传进行可靠传输。而不消耗序列号的ACK则不是。头部长度(图中的数据偏移)以32位字为单位,也就是以4bytes为单位,它只有4位,最大为15,因此头部最大长度为60字节,而其最小为5,也就是头部最小为20字节(可变选项为空)。ACK
2019年1月15日