我是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 關注
- 122 瀏覽
添加回答
舉報
0/150
提交
取消