有没有办法拦截go函数

  • 本文关键字:go 函数 有没有 go
  • 更新时间 :
  • 英文 :


我是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()
}

在go中有更好的模式吗?例如Java中的AOP。

感谢

正如@Volker所指出的,没有办法在AOP意义上拦截/编织代码。然而,您可以通过使用闭包来绕过decorator模式的函数参数限制

package main
import "fmt"
type Foo struct{}
func (foo Foo) f1(a int) {
fmt.Printf("f1: %vn", a)
}
func (foo Foo) f2(a, b int) {
fmt.Printf("f2: %v, %vn", a, b)
}
func (foo Foo) f3(a, b, c int) int {
fmt.Printf("f3: %v, %v, %vn", a, b, c)
return a + b + c
}
func Wrap(f func()) {
fmt.Printf("preCalln")
f()
fmt.Printf("postCalln")
}
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: %vn", res)
}

Go Playgorund

有办法拦截go函数吗?

不,没有。

Go不提供这样的东西,因为源代码被直接编译为机器代码,Go的运行时没有选择挂接这样的东西。

最新更新