自己写了一个 golang aspect 面向切面的项目,
地址是这里 https://github.com/Justice-love/go-aspect , 求 star.
实现的效果如下图:
1
dcalsky 2021-06-03 14:21:56 +08:00
虽然简单,但是依然闻到了 spring 的恶臭。
|
2
qfdk 2021-06-03 14:26:48 +08:00
想法不错啊,回头看看,但是 这样不又是回到 spring 了么 ?
|
3
justicelove OP @qfdk #2 spring 的代表是 IOC 依赖注入, 切面是 spring 之外也独立存在的
|
4
qfdk 2021-06-03 14:36:29 +08:00
@justicelove #3 记得这一套 打印日志特别好用。 已经远离很久了
|
8
generic 2021-06-03 16:32:50 +08:00
一边 if err!=nil 一边玩这种魔法吗?风格上完全两个极端啊...
|
9
wdlth 2021-06-03 22:27:59 +08:00
这个是参考 aspectj 那种吧,编译期织入的。
|
10
justicelove OP @wdlth #9 是的
|
11
xx6412223 2021-06-04 10:00:04 +08:00
@justicelove 是在 编译前对文件进行插入文本吧。怎么是编译器织入?
|
12
justicelove OP @xx6412223 #11 没有说是编译器织入, 只是需要使用其他的指令来代替 go build 进行编译
|
13
qianxiaoxiao 2021-06-07 11:58:30 +08:00
spring 的恶趣味
|
14
fumeboy 2021-07-10 17:21:00 +08:00
最近也在思考怎么在 go 实现 AOP 。我的倾向是 我编写业务代码,用 gen 工具生成增强后的函数,函数签名一致。
比如 ```go // +build dev func proc1() (err error) { a, err := proc2() b, err := proc3() if a + b == 3 { metrcisAt3() } return } ``` 增强为 ```go // +build !dev func proc1() (err error) { logAtStart() a, err := proc2() if err != nil{ logAtErr() return err } b, err := proc3() if err != nil{ logAtErr() return err } if a + b == 3 { metrcisAt3() } return } ``` |
16
justicelove OP @fumeboy #14 使用这种 tag 做隔离,好处是直观可控,坏处也就是对开发人员的要求比较高
|