英文:
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>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论