如何在 Go 中使用/实现切面方向?

我想监视任意方法调用,并且我对方法调用的 3 个指标感兴趣:

  1. 总时间

  2. 请求总数

  3. 错误总数

在Java中,我可以定义一个注释,在方法调用之前和之后注入指标初始化和计算。例如:

@Monitor
public void foo() {
   // do some stuff...
   }

@Monitor注释将在 之前和之后注入一些代码foo以为其生成指标。

Go 中是否有类似的方法来实现这一目标?


守着星空守着你
浏览 135回答 2
2回答

jeck猫

检查Go 的面向方面编程框架和this。并查看如何在 Go 中编写基准测试 - Dave Cheney您可以使用代理函数来执行此操作:total time: 1.002061047stotal number of requests: 10number of errors: 0代理功能:func (p *metrics) proxy(user func() error) func() error {    return func() error {        p.nCalls++        t0 := time.Now()        err := user()        t := time.Since(t0)        // p.d = append(p.d, t)        p.total += t        if err != nil {            p.nErrs++        }        return err    }}全部:package mainimport (    "fmt"    "time")func main() {    m := new(metrics)    f := m.proxy(user)    for i := 0; i < 10; i++ {        f()    }    m.show()}func user() error {    time.Sleep(100 * time.Millisecond)    return nil}type metrics struct {    nCalls, nErrs int    total         time.Duration    // d []time.Duration}func (p *metrics) proxy(user func() error) func() error {    return func() error {        p.nCalls++        t0 := time.Now()        err := user()        t := time.Since(t0)        // p.d = append(p.d, t)        p.total += t        if err != nil {            p.nErrs++        }        return err    }}func (p *metrics) show() {    fmt.Println("total time:", p.total)    fmt.Println("total number of requests:", p.nCalls)    fmt.Println("number of errors:", p.nErrs)}

慕桂英3389331

在 Go[...] 中是否有类似的方法来实现这一点?不。您必须编写一个包装器来手动拦截输入、分析输出并测量时间。(请注意,如果语言只是“Go”,则名称。golang.org 是网站。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go