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,先执行逻辑,延迟一些逻辑并调用传递给包装函数的函数,这样就足够了吗?