小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《在 Go 语言中如何使用/实现切面?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!
问题内容我想监控任意方法调用,并且我对方法调用的 3 个指标感兴趣:
- 总时间
- 请求总数
- 错误总数
在java中,我可以定义一个注释,在方法调用之前和之后注入指标初始化和计算。例如:
@Monitor
public void foo() {
// do some stuff...
}
这个 @monitor
注释将在 foo
之前和之后注入一些代码以为其生成指标。
go 中是否有类似的方法可以实现此目的?
解决方案
检查 Aspect-Oriented Programming framework for Go 和 this。
并查看 How to write benchmarks in 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)
}
没有。
您必须编写一个包装器来手动拦截输入、分析输出并测量时间。
(请注意,如果语言只是“go”,则名称。golang.org 是网站。)
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持编程网!更多关于Golang的相关知识,也可关注编程网公众号。