gpt4 book ai didi

go - 在每个函数之前自动运行代码

转载 作者:IT王子 更新时间:2023-10-29 01:01:17 29 4
gpt4 key购买 nike

我想在许多函数的开头运行一些代码(授权检查),例如:

func (s *apiService) get(request Request) (Result, error) {
err := authorizationCheck(request)
if err != nil {
return nil, err
}
//method logic
}

func (s *apiService) put(request Request) (Result, error) {
err := authorizationCheck(request)
if err != nil {
return nil, err
}
//method logic
}

有没有一种优雅的方法可以避免在每个函数开始时进行相同的授权检查?

最佳答案

用一个简单的包装器

由于所有方法(至少我是这样认为的)都具有相同的签名,您可以将所有冗余代码放在一个包装函数中,该函数将您需要运行的函数作为附加参数。包装器将首先检查错误,然后运行函数。因此,您的方法只需要在其中包含相关代码,而无需先检查错误。

这是一个示例,我将包装器称为 wrap 只是为了清楚:

func (s *apiService) get(request Request) (Result, error) {
//method logic
}

func (s *apiService) put(request Request) (Result, error) {
//method logic
}

func wrap(f func (Request) (Result, error), request Request) (Result, error) {
err := authorizationCheck(request)
if err != nil {
return nil, err
}

return f(request)
}

然后,稍后在您的代码中:

res, err := wrap(s.get, someRequest)

用装饰器

与上面的非常相似,但更简洁:您可以实现一个装饰器,而不是创建一个包装器,该装饰器返回一个函数,该函数包装您的方法并在调用它们之前进行错误检查。这只能在所有方法都具有相同签名的情况下才能完成,但它比使用包装器更强大,恕我直言,这是一种更清洁的解决方案。

这是一个例子,装饰器是decorate(对我的创意赞不绝口):

func (s *apiService) get(request Request) (Result, error) {
//method logic
}

func (s *apiService) put(request Request) (Result, error) {
//method logic
}

func decorate(f func(Request) (Result, error)) func(Request) (Result, error) {
return func(r Request) (Result, error) {
err := authorizationCheck(r)
if err != nil {
return nil, err
}

return f(r)
}
}

然后,稍后在您的代码中:

res, err := decorate(s.get)(someRequest)

方法还是普通函数?

无论您喜欢简单的包装器还是装饰器,如果需要,您也可以将它们作为 apiService 对象的方法(只需在前面添加 (s *apiService)他们的名字),确实没有太大区别,但如果您希望您的结构在您使用它的任何地方都可以使用包装器/装饰器,而不仅仅是在那个特定文件中,这将是首选选项。

然后相对调用会变成:

res, err := s.wrap(s.get, someRequest)

和:

res, err := s.decorate(s.get)(someRequest)

关于go - 在每个函数之前自动运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50882533/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com