
距离我2019年的深入Go并发编程研讨课发布也有一年时间了。在Gopher Beijing 2019相关演讲后我整理了这一个8小时的课程,对有志于深入理解Go并发编程原理的同学从深度和广度上提供一些帮助。当然一年来我也一直关注着Go并发编程的演变,并且补充了池和并发模式的一些例子。对于官方的并发库来说,这一年来又有哪些变化呢,让我们快速回顾一下。
距离我2019年的深入Go并发编程研讨课发布也有一年时间了。在Gopher Beijing 2019相关演讲后我整理了这一个8小时的课程,对有志于深入理解Go并发编程原理的同学从深度和广度上提供一些帮助。当然一年来我也一直关注着Go并发编程的演变,并且补充了池和并发模式的一些例子。对于官方的并发库来说,这一年来又有哪些变化呢,让我们快速回顾一下。
昨天 Ian Lance Taylor 和 Robert Griesemer 发布了Go泛型的新的草案(The Next Step for Generics), 国内外的Gopher反响非常的热烈,大家纷纷对草案和这个文章进行了解读,并且感觉这一版的Go泛型设计基本接近于Go的泛型目标,总之比前一个方案好太多了。
同时Ian也提供了一个在线编译的工具go2go,可以对Go泛型编程进行尝鲜。
如果在本地编译呢?
今天Ian Lance Taylor和Robert Griesemer新推出一篇文章,介绍了Go泛型的新方案。两位都是Go核心开发组中的老大,也是负责Go泛型特性的负责人。
本文带你了解Go泛型的最新进展,更详细的介绍请看The Next Step for Generics、Type Parameters - Draft Design、Summary of Go Generics Discussions、issue#15292。
反模式(anti-pattern或antipattern)又叫做反面模式,指的是在实践中经常出现但又低效或是有待优化的设计模式,是用来解决问题的带有共同性的不良方法。Andrew Koenig在1995年造了anti-pattern这个词,灵感来自于GoF的《设计模式》一书。
按《AntiPatterns》作者的说法,可以用至少两个关键因素来把反面模式和不良习惯、错误的实践或糟糕的想法区分开来:
维基百科上列出了一些反模式列表: 反面模式, 我开了☝系列,用来记录Go语言开发中的一些反模式。
这是第一篇,介绍 越俎代庖
反模式,或者叫做画蛇添足
反模式,或者叫做镀金
反模式(Gold plating
)。 意思是指项目已经达到了设计的最高价值,结果还添加额外的功能,反而使项目变得很差。
rpcx是一个流行的Go语言实现的服务治理的框架,只要你简单会写Go的函数,你就能实现带服务治理的RPC服务,超级简单,比如下面的加法服务:
|
|
但是,很多情况下,尤其在大型互联网公司中,常用Protobuf
的proto
文件定义数据类型(Message
)和(Service
),这样做有一个好处,就是方便部门和部门、服务提供者和服务使用者之间沟通,通过 IDL 文件的方式更能精准的描述服务和数据类型。
比如下面的helloworld.proto
,定义一个打招呼的服务(Greeter
), 这个服务使用HelloRequest
和HelloResponse
做请求参数和返回结果:
|
|
rpcx的用户也不止一次的提出希望rpcx也能支持从proto生成rpcx服务端和客户端的代码,现在可以宣布了,rpcxio组织提供了两个protoc的插件,可以方便的生成Go代码,和grpc插件的使用姿势一样:
下面就介绍这两种工具的实现。
Redis 6.0 发布了。
Redis 6.0的新特性也是在一步步的讨论和优化中确定的。
很多的特性已经在之前的RC等版本中介绍过了。
但是正式GA版中也有一些新的变化:
@antirez 提到只是Redis历史上最大的一次版本更新,所以谨慎建议在应用的产品中还是多多测试评估,并且承诺一旦遇到大的bug就会紧急发布6.0.1版。果不其然,一天后就发布了 6.0.1版,修复了一个allocator的bug,这个bug是为了优化而引入的,现在暂时去掉了。
I just released Redis 6.0.1. Unfortunately there was a bug in Redis 6.0.0 introduced just a few days before the release, that only happens when using the non-default allocator (libc malloc in this case triggers it). Optimization reverted, 6.0.1 released. Sorry for the issue.
本文主要关注Client side caching(客户端缓存)这一特性。
smallnest/RESP3 是Redis RESP3协议的解析库,你可以使用它和Redis底层通讯,或者包装它实现新版的Redis client库或者Redis Server端。
编译自 Custom JSON Marshalling in Go。
我们知道,通过tag,可以有条件地实现定制Go JSON序列化的方式,比如json:",omitempty"
, 当字段的值为空的时候,我们可以在序列化后的数据中不包含这个值,而json:"-"
可以直接不被JSON序列化,如果想被序列化key-
,可以设置tag为json:"-,"
,加个逗号。
如果你为类型实现了MarshalJSON() ([]byte, error)
和UnmarshalJSON(b []byte) error
方法,那么这个类型在序列化反序列化时将采用你定制的方法。
这些都是我们常用的设置技巧。
如果临时想为一个struct增加一个字段的话,可以采用本译文的技巧,临时创建一个类型,通过嵌入原类型的方式来实现。他和JSON and struct composition in Go一文中介绍的技巧还不一样(译文和jsoniter-go扩展可以阅读陶文的Golang 中使用 JSON 的一些小技巧)。JSON and struct composition in Go
一文中是通过嵌入的方式创建一个新的类型,你序列化和反序列化的时候需要使用这个新类型,而本译文中的方法是无痛改变原类型的MarshalJSON
方式,采用Alias
方式避免递归解析,确实是一种非常巧妙的方法。
以下是译文:
Go是静态类型的编程语言,自2009年发布以来,已经十多岁了。现在,Go广泛应用于云原生系统、微服务、web开发、运维等场景,并且在webassembly、嵌入式等也有进一步的探索。尤其在中国,Go语言越来越多的被众多公司和开发者所采用,相关的研究文章也不断的涌现,从编译器的优化、运行时的内部机制、标准库的设计、语言规范的探索、第三库的研究和应用、产品中的应用、不同语言的比较等等目不暇接。
Go是面向对象的编程语言吗?