我是golang的新手,想知道是否有任何方法可以拦截函数。例如,如果我有:func (foo Foo) f1(a int) int {...}func (foo Foo) f2(a, b int) int {...}func (foo Foo) f3(a, b, c int) int {...}我想实现一些日志记录功能,而不是在每个函数中放置前置和后置拦截器:func (foo Foo) f1(a int) int { preCall() ... postCall()}func (foo Foo) f2(a, b int) int { preCall() ... postCall()}func (foo Foo) f3(a, b, c int) int { preCall() ... postCall()}有没有更好的模式来做到这一点?例如Java中的AOP。
2 回答

蝴蝶不菲
TA贡献1810条经验 获得超4个赞
没有办法在AOP意义上拦截/编织代码。但是,您可以使用闭包来解决装饰器模式的函数参数限制
package main
import "fmt"
type Foo struct{}
func (foo Foo) f1(a int) {
fmt.Printf("f1: %v\n", a)
}
func (foo Foo) f2(a, b int) {
fmt.Printf("f2: %v, %v\n", a, b)
}
func (foo Foo) f3(a, b, c int) int {
fmt.Printf("f3: %v, %v, %v\n", a, b, c)
return a + b + c
}
func Wrap(f func()) {
fmt.Printf("preCall\n")
f()
fmt.Printf("postCall\n")
}
func main() {
f := Foo{}
var res int
Wrap(func() { f.f1(1) })
Wrap(func() { f.f2(1, 2) })
Wrap(func() { res = f.f3(1, 2, 3) })
fmt.Printf("res of f3: %v\n", res)
}
- 2 回答
- 0 关注
- 103 浏览
添加回答
举报
0/150
提交
取消