前言
golang官方默认是不支持tls(Thread Local Storage)的。支持tls的语言也不多,比如C++和GCC-C(gcc的c语言扩展,用于linux)。go官方拒绝实现tls,而为了解决tls问题,引入了上下文context包(闭包一定程度也是一种上下文)。通过上下文参数传递的方式来传递本地变量。这种方式好处就是显式上下文明确,坏处就是每个函数都要多一个上下文参数,传来传去的。黑客当然不会满足于此,于是乎一个哥们开源了go-tls
https://github.com/huandu/go-tls
代码不复杂,使用也比较简单。参考它的READ即可。
go-tls原理
简单介绍一下实现原理
它为每个协程定义了全局唯一的递增id,以及定义了一个全局的map用于存储每个协程的数据。map的key是协程的g结构地址,如此保证了数据是局部于协程的。由于map是全局的,多个协程会同时访问,属于临界区,因此添加了读写锁。如下定义
var (
tlsDataMap = map[unsafe.Pointer]*tlsData{