-
Notifications
You must be signed in to change notification settings - Fork 0
AddInt usage
KerwinKoo edited this page Jan 25, 2016
·
3 revisions
AddInt是对某个内存地址的值进行读取和累加,通常用于全局的累加计数。该method引自Package atomicbuild-in package。
Goa项目中间件有个request全局跟踪的功能便是使用AddInt完成的,其涉及的代码如下:
// Counter used to create new request ids.
var reqID int64
...
// RequestID is a middleware that injects a request ID into the context of each request.
// Retrieve it using ctx.Value(ReqIDKey). If the incoming request has a RequestIDHeader header then
// that value is used else a random value is generated.
func RequestID() goa.Middleware {
return func(h goa.Handler) goa.Handler {
return func(ctx *goa.Context) error {
id := ctx.Request().Header.Get(RequestIDHeader)
if id == "" {
id = fmt.Sprintf("%s-%d", reqPrefix, atomic.AddInt64(&reqID, 1))
}
ctx.SetValue(ReqIDKey, id)
return h(ctx)
}
}
}首先定义一个全部变量reqID int64,需要这个变量在不受环境限制的情况下进行累加。调用函数atomic.AddInt64(&reqID, 1)来实现,其中第一个参数是要求进行read、write & store的内存地址,第二个参数是每次累加的步长。