渐渐地, Go泛型越来越多应用的Go的标准库中了。一些标准库的类型,比如container/heap
、container/list
、container/ring
、math
都是有机会支持泛型的,但是考虑到Go向下兼容的情况,这些包可能不会直接修改,最可能就是新建一些并发的包,或者放在扩展包中。
本篇文章将讲一个相对复杂的例子,也就是对sync.Map
的修改,让它支持泛型。
渐渐地, Go泛型越来越多应用的Go的标准库中了。一些标准库的类型,比如container/heap
、container/list
、container/ring
、math
都是有机会支持泛型的,但是考虑到Go向下兼容的情况,这些包可能不会直接修改,最可能就是新建一些并发的包,或者放在扩展包中。
本篇文章将讲一个相对复杂的例子,也就是对sync.Map
的修改,让它支持泛型。
在Go 1.21中, 增加了和sync.Once有关的三个函数。sync.Once本身实现就非常简单了,新增加的这三个函数到底是干啥的?让我们一起来看看。
Go 1.21中新增加了三个内建的函数,相比以前的len
、cap
、delete
、append
、close
、panic
等函数,又有了新的变化,让我们一起来看看吧。
给大家分享一个阻止Go程序退出的方法集合,其中还是有一些脑洞大开的方法。你有什么别的方法可以阻止Go程序退出么,欢迎在留言区留言。
前一段时间写了一篇高性能批量读写网络包, 里面介绍了sendmmsg
系统调用,可以批量发送网络包,有读者询问这和writev
有什么区别。
我们使用Go标准库中的net
包,很容易发送UDP和TCP的packet,以及在它们基础上开发应用层的程序,比如HTTP、RPC等框架和程序,甚至我们可以利用官方扩展包golang.org/x/net/icmp
,专门进行icmp packet的发送和接收,不过,有时候我们想进行更低层次的网络通讯,这个时候我们就需要借助一些额外的库,或者做一些额外的设置,当前相关的介绍IP层packet收发技术并没有很好的组织和介绍,本文尝试介绍几种收发IP packet的方式。
依然,我们介绍IPv4相关的技术, IPv6会单独一章进行介绍。
在使用Go实现ping工具那一篇文章中,我们自己实现了ping工具的基本功能,我们也了解了ping底层实现的原理。读者@ZerOne提出一个问题:能不能实现单向跟踪路由的功能,类似 ping -R
一样,从A端tracert B端,同时显示B端到A端的路径?
traceroute是一种用于诊断网络连接问题的实用程序,它可以确定两台计算机之间的网络路径和网络时延。traceroute工具在网络工程、系统管理和网络安全中都有广泛的应用。
ping是一个网络工具,它被广泛地用于测试网络连接的质量和稳定性。当我们想知道我们的电脑是否能够与其他设备或服务器进行通信时,ping就是我们最好的朋友。当我们想侦测网络之间的连通性和网络质量的时候,也常常使用ping工具测量,因为它是操作系统常带的一个网络诊断工具,小而强大。
ping最初是由Mike Muuss在1983年为Unix系统开发的。它的名字是来自于海军潜艇的声纳系统,声纳系统通过发送一个声波并测量其返回时间来确定目标的位置。Ping的工作原理类似,它发送一个小数据包到目标设备,然后等待该设备返回一个响应,以测量其响应时间和延迟。
虽然网络协议栈提供了丰富的功能,让我们可以方便的实现网络的数据交流,但是有时候我们对协议栈的性能还是不是那么满意的,前几篇文章我也介绍了通过XDP等技术高效处理网络数据的方式,但是毕竟XDP还没有那么广泛的应用,使用起来也还不是那么简单,如果我们通过编程语言提供的标准库来实现数据的读写,还怎么能提高性能呢?今天就介绍一种方式,批量的读写数据包。