本文主要是介绍Go语言中忘记字符串格式化可能产生的副作用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
格式化字符串是开发人员经常要进行操作,无论是返回错误还是记录消息。但在处理并发应用程序时,开发人员很容易忘记字符串格式化带来的潜在副作用。下面将看到两个具体示例:一个是读取etcd存储导致数据竞争,另一个是导致死锁的情况。
1. etcd数据竞争
etcd是一个用Go实现的分布式键值存储,它在包括Kubernetes在内在的许多项目中用于存储所有集群数据。它提供了与集群交互的API。例如,Watcher接口用于接收数据变化的通知:
type Watcher interface {/ Watch watches on a key or prefix. The watched events will be returned/ through the returned channel./ ...Watch(ctx context.Context, key string, opts ...OpOption) WatchChanClose() error
}
API 依赖于gRPC流。gRPC流是一种在客户端和服务器之间不断交换数据的技术。服务器必须维护使用此功能的所有客户端的列表。因此,Watcher接口由包含所有活动流的watcher结构体实现:
type watcher struct {/ .../ streams hold all the active gRPC streams keyed by ctx value.streams map[string]*watchGrpcStream
}
map的键基于调用Watch方法时提供的上下文:
func (w *watcher) Watch
这篇关于Go语言中忘记字符串格式化可能产生的副作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!