为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
守着星空守着你 2023-08-07 15:17:34
我想监视任意方法调用,并且我对方法调用的 3 个指标感兴趣:总时间请求总数错误总数在Java中,我可以定义一个注释,在方法调用之前和之后注入指标初始化和计算。例如:@Monitor public void foo() {    // do some stuff...    }该@Monitor注释将在 之前和之后注入一些代码foo以为其生成指标。Go 中是否有类似的方法来实现这一目标?
查看完整描述

2 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

检查Go 的面向方面编程框架和this。

并查看如何在 Go 中编写基准测试 - Dave Cheney


您可以使用代理函数来执行此操作:

total time: 1.002061047s

total number of requests: 10

number 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 main


import (

    "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)

}


查看完整回答
反对 回复 2023-08-07
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

在 Go[...] 中是否有类似的方法来实现这一点?

不。

您必须编写一个包装器来手动拦截输入、分析输出并测量时间。

(请注意,如果语言只是“Go”,则名称。golang.org 是网站。)


查看完整回答
反对 回复 2023-08-07
  • 2 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信