如何在Go中使用面向方面的编程(AOP)?

huangapple go评论88阅读模式
英文:

How to use aspect-oriented programming (AOP) in Go?

问题

我是一个Go的新手。我想使用Prometheus监控功能级别,并尽量通用,就像Spring的事务处理一样。我尝试使用面向切面编程。我尝试了以下代码:

type BizFunc func()

func DoAndMonitor(bizFunc BizFunc) {
   // 监控开始
   defer func() {
      // 监控结束
   }()
   bizFunc()
}

但是没有与任何函数兼容的函数类型。

所以我想知道这个在Go中是否可以实现?

英文:

I am a Go rookie. I want to use the Prometheus monitoring function level and try to be as generic as possible, like spring transactional. Using aspect oriented programming. I tried the following:

type BizFunc func()

func DoAndMonitor(bizFunc BizFunc) {
   // monitor begin
   defer func() {
      // monitor end
   }()
   bizFunc()
}

but there is no function type that's compatible with any function.

So I wonder whether this can be implemented in Go?

答案1

得分: 2

只接受 func()。如果你需要调用带参数的函数,请将该函数调用包装在匿名函数中。

定义:

type BizFunc func()

func DoAndMonitor(bizFunc BizFunc) {
   // 监控开始
   defer func() {
      // 监控结束
   }()
   bizFunc()
}

用法:

// 无参数函数
var myFunc func()
// 直接传递
DoAndmonitorBizFunc(myFunc)

// 带参数的函数
var myFunc2 func(string, int)
// 实际函数调用被包装在匿名函数中
DoAndMonitorBizFunc(func() { myFunc2("hello", 1) })
英文:

Accept only func(). If you need to call a function with arguments, wrap that function call in an anonymous function.

Definition:

type BizFunc func()

func DoAndMonitor(bizFunc BizFunc) {
   // monitor begin
   defer func() {
      // monitor end
   }()
   bizFunc()
}

Usage:

// with no-argument function
var myFunc func()
// pass it directly
DoAndmonitorBizFunc(myFunc)

// function with arguments
var myFunc2 func(string, int)
// actual function call gets wrapped in an anonymous function
DoAndMonitorBizFunc(func() { myFunc2("hello", 1) })

</details>



huangapple
  • 本文由 发表于 2022年10月26日 11:25:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/74202371.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定