V2EX-最热主题 ( ) • 2024-04-30 23:21
afxcn:

我们开发的时候使用了 sync.Pool ,所以需要考虑资源释放问题。

例如下面这样一段代码:

// bearerAuth is a function that performs bearer token authentication and authorization based on the provided access token and values.
func bearerAuth(c *web.Ctx, vals ...int64) error {

accessToken := c.BearerToken()

if accessToken == "" {
return web.ErrUnauthorized
}

cat, err := proxy.GetAuthByAccessToken(accessToken)

if err != nil {
return err
}

c.Init(cat.UserID, cat.UserRight)

if !utils.CheckVals(cat.UserRight, vals...) {
cat.Release()
return web.ErrForbidden
}

cat.Release()

return nil
}

我们得在所有退出路径上调用 cat.Release(),有了 defer ,我们只需要这样就解决问题了

func bearerAuth(c *web.Ctx, vals ...int64) error {

accessToken := c.BearerToken()

if accessToken == "" {
return web.ErrUnauthorized
}

cat, err := proxy.GetAuthByAccessToken(accessToken)

if err != nil {
return err
}

defer cat.Release()

c.Init(cat.UserID, cat.UserRight)

if !utils.CheckVals(cat.UserRight, vals...) {
return web.ErrForbidden
}

return nil
}

如果是自己建对象,就更方便了:

user := model.CreateUser() defer user.Release()