AddInt usage - KerwinKoo/KerwinKoo.github.io GitHub Wiki

AddInt寄存器累加

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的内存地址,第二个参数是每次累加的步长。

⚠️ **GitHub.com Fallback** ⚠️