Go 1.22中可以 range 一个整数,比如下面的代码:
|
|
这个大家都已经知道了,其实对应的提案中还有一个隐藏的功能,就是可以 range 一个函数,比如下面的代码(摘自官方代码库internal/trace/v2/event.go):
|
|
就少有介绍了。
本文尝试介绍它,让读者先了解一下,它在Go 1.22 中是一个实验性的功能,还不确定未来在哪个版本中会被正式支持。
官方wiki中也有一篇介绍: Rangefunc Experiment,类似问答的形式,也是必读的知识库。
Go 1.22中可以 range 一个整数,比如下面的代码:
|
|
这个大家都已经知道了,其实对应的提案中还有一个隐藏的功能,就是可以 range 一个函数,比如下面的代码(摘自官方代码库internal/trace/v2/event.go):
|
|
就少有介绍了。
本文尝试介绍它,让读者先了解一下,它在Go 1.22 中是一个实验性的功能,还不确定未来在哪个版本中会被正式支持。
官方wiki中也有一篇介绍: Rangefunc Experiment,类似问答的形式,也是必读的知识库。
除了通常的新有线/无线网络硬件支持和大型 Linux 网络子系统中的其他例行变动之外,Linux 6.8 内核还对核心网络代码进行了一些关键改进,当遇到许多并发网络连接时,TCP 性能可以提高 ~40%。
双缓冲(double buffering)是高效处理I/O操作的一种并发技术,它使用两个buffer,一个goroutine使用其中一个buffer进行写,而另一个goroutine使用另一个buffer进行读,然后进行交换。这样两个goroutine可能并发的执行,减少它们之间的等待和阻塞。
本文还提供了一个类似Java的java.util.concurrent.Exchanger的Go并发原语,它可以用来在两个goroutine之间交换数据,快速实现双缓冲的模式。 这个并发原语可以在github.com/smallnest/exp/sync/Exchanger找到。
这篇文章我们来了解一下隐藏在Go运行时中的一些并发原语, 因为运行时是底座和包循环依赖等原因,运行时中很少使用标准库中的并发原语,它有自己的并发原语。
如果我们将Go语言的并发原语弄的滚瓜烂熟,那么我们使用组合的方式,创造出更高级的并发原语,针对一些特定的并发场景,可以提供更高效的并发原语。
这篇文章就是就是利用atomic中的并发原语和条件变量,组合出类似C++ 20规范中atomic类型的wait/notify_one/notify_all的功能。
Go 1.22中一个很大的变化是http.ServeMux
中的模式匹配,先前这个功能是很多第三方的web框架或者router库实现的。
我们很有必要好好研究它,将来在实现HTTP API的时候可能优先使用它。
Go 1.22 就要在龙年春节期间发布了。Go 1.22的新特性包括了新的 math/rand
包。这个包的目标是提供一个更好的伪随机数生成器,它的 API 也更加简单易用。本文将介绍这个新的包的特性。
有时候批量积攒一批数据集中处理,是一个高效的提高程序性能的方法,比如我们可以批量写入数据库,批量发送消息到kafka,批量写入网络数据等等。
批量把数据收集出来,我们常用channel类型,此时channel的功能就是一个buffer,多个生产者把数据写入到channel中,消费者从channel中读取数据,但是Go的channel并没有提供批量读取的方法,我们需要自己实现一个。
Java中的Phaser是一个同步原语,它可以让多个线程在某个时刻同步执行。它和Barrier有点类似,但是它比Barrier更加灵活。