最近看到一本关于算法的新书,买过来学习。
这本书中有一道并发问题,也是我先前多次分过的一道题:水分子的产生:
MPTCP: 一个在 Go 1.21中的被忽略的新特性
Go 1.21 再有两三个月就发布了,很多同学都已经总结了Go 1.21的新特性了,为新的Go版本的到来造势,但是我还没看到有同学专门介绍Go 1.21为网络库新增加的一个特性,所以我专门新开一篇专门来介绍。
替换标准库的map实现,SwissTable更快?
在最新的一期Go开发团队的每周会议中,他们讨论了Google3再评估SwissTable的性能,或许值得跟进,替换标准库的map。
- SwissTable
- [MichaelP]: Google3 may want to do some benchmarking on this. Maps are used heavily in google3. This may be of value to us.
- So this may be worth investing in.
一个泛型的有序Go Map实现
我们知道, Go内建的map类型对于插入的元素并没有保持它们的插入顺序,遍历的时候也故意设置成随机的。因此,如果我们想让map保持元素的插入顺序,需要借助第三方的库才行,今天就给大家介绍一个这样的库OrderedMap。
其实在其他编程语言中,也有类似的数据结构,比如java中的 LinkedHashMap, python中的OrderedDict
。
本文介绍如何使用Go语言实现这样的一种数据类型。注意我们要实现的是OrderedMap, 不是SortedMap或者TreeMap,SortedMap遍历的时候是按照Key的排序顺序遍历的,我们可以通过先获取所有的key并排序,再逐个访问对应的值。
但是OrderedMap遍历的时候要是保持插入的顺序,这怎么办到的呢?
让 sync.Map 支持泛型
渐渐地, Go泛型越来越多应用的Go的标准库中了。一些标准库的类型,比如container/heap
、container/list
、container/ring
、math
都是有机会支持泛型的,但是考虑到Go向下兼容的情况,这些包可能不会直接修改,最可能就是新建一些并发的包,或者放在扩展包中。
本篇文章将讲一个相对复杂的例子,也就是对sync.Map
的修改,让它支持泛型。
sync.Once的新扩展
在Go 1.21中, 增加了和sync.Once有关的三个函数。sync.Once本身实现就非常简单了,新增加的这三个函数到底是干啥的?让我们一起来看看。
你知道吗?Go新增加了三个内建函数
Go 1.21中新增加了三个内建的函数,相比以前的len
、cap
、delete
、append
、close
、panic
等函数,又有了新的变化,让我们一起来看看吧。
怎么阻止一个Go程序退出?
给大家分享一个阻止Go程序退出的方法集合,其中还是有一些脑洞大开的方法。你有什么别的方法可以阻止Go程序退出么,欢迎在留言区留言。
高性能批量读写网络包 补遗
前一段时间写了一篇高性能批量读写网络包, 里面介绍了sendmmsg
系统调用,可以批量发送网络包,有读者询问这和writev
有什么区别。
几种使用Go发送IP包的方法
我们使用Go标准库中的net
包,很容易发送UDP和TCP的packet,以及在它们基础上开发应用层的程序,比如HTTP、RPC等框架和程序,甚至我们可以利用官方扩展包golang.org/x/net/icmp
,专门进行icmp packet的发送和接收,不过,有时候我们想进行更低层次的网络通讯,这个时候我们就需要借助一些额外的库,或者做一些额外的设置,当前相关的介绍IP层packet收发技术并没有很好的组织和介绍,本文尝试介绍几种收发IP packet的方式。
依然,我们介绍IPv4相关的技术, IPv6会单独一章进行介绍。