Golang中每个函数调用的前置函数和后置函数

Golang中每个函数调用的前置函数和后置函数,go,Go,我想为每个函数执行一些常见操作。在函数开始之前和函数结束之前 func Command1Processor() error { preCheck() // Actual command1 logic postCheck() } func Command2Processor() error { preCheck() // Actual command2 logic postCheck() } GoLang中是否有支持此功能的功能,以便我只编写逻辑,并自动调用

我想为每个函数执行一些常见操作。在函数开始之前和函数结束之前

func Command1Processor() error {
   preCheck()
   // Actual command1 logic
   postCheck()
}

func Command2Processor() error {
   preCheck()
   // Actual command2 logic
   postCheck()
}

GoLang中是否有支持此功能的功能,以便我只编写逻辑,并自动调用pre/post函数。

其中一些功能可以使用defer实现自动化

编写一个执行预检查的函数,并返回一个执行后检查的函数

func check() func() {
   // do the pre-check
   return func() {
      // do the post-check
   }
}
像这样使用它:

func Command2Processor() error {
   defer check()() // note the double ()().
   // Actual command2 logic
}

.

其中一些可以使用“延迟”自动完成

编写一个执行预检查的函数,并返回一个执行后检查的函数

func check() func() {
   // do the pre-check
   return func() {
      // do the post-check
   }
}
像这样使用它:

func Command2Processor() error {
   defer check()() // note the double ()().
   // Actual command2 logic
}

.

您可以通过使用HTTP处理程序非常流行的中间件模式来实现这一点

您需要一个通用的中间件功能,如

func withCheck(http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        preCheck()
        h.ServeHTTP(w, r)
        postCheck()
    })
}
然后,您可以通过将处理程序另外包装到withCheck中间件中来连接它们:

myHandler := newMyHandler()
http.Handle("/foo", withCheck(myHandler))
这样,在每次处理程序调用之前和之后都会调用preCheck和postCheck

对于没有参数的命令处理器,示例如下所示:

type CommandProcessor func()

func withCheck(cp CommandProcessor) CommandProcessor {
    return CommandProcessor(func() {
        preCheck()
        cp()
        postCheck()
    })
}

func CommandProcessor1() {
    // Actual logic
}

func main() {
    cp1 := withChecker(CommandProcessor1)
}

这种方法的优点是您可以拥有多个中间件。此模式很容易适应任意数量的参数和/或函数结果。

您可以通过使用HTTP处理程序非常流行的中间件模式来实现这一点

您需要一个通用的中间件功能,如

func withCheck(http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        preCheck()
        h.ServeHTTP(w, r)
        postCheck()
    })
}
然后,您可以通过将处理程序另外包装到withCheck中间件中来连接它们:

myHandler := newMyHandler()
http.Handle("/foo", withCheck(myHandler))
这样,在每次处理程序调用之前和之后都会调用preCheck和postCheck

对于没有参数的命令处理器,示例如下所示:

type CommandProcessor func()

func withCheck(cp CommandProcessor) CommandProcessor {
    return CommandProcessor(func() {
        preCheck()
        cp()
        postCheck()
    })
}

func CommandProcessor1() {
    // Actual logic
}

func main() {
    cp1 := withChecker(CommandProcessor1)
}

这种方法的优点是您可以拥有多个中间件。此模式很容易适应任意数量的参数和/或函数结果。

您可以在方法中接受func,先执行逻辑,推迟一些逻辑并调用传递给包装函数的函数,这样就足够了吗?您可以在方法中接受func,先执行逻辑,延迟一些逻辑并调用传递给包装函数的函数,这样就足够了吗?