简介
go-aspect是一个为golang提供切面编程可能性的工具,可以使用该工具,替换原有的go build来进行编译,将预先配置好的切面编织到目标代码中
项目地址https://github.com/Justice-love/go-aspect
效果图
安装方式
源码安装
- 下载源码到本地
- 切换到源码目录,运行 make install
使用简介
编织是基于目标代码根目录下的aspect.point
文件进行,文件样例如下:
import "context"
import "fmt"
import "time"
point after(test.*X.Inject(c Context)) {
fmt.Println("456")
fmt.Println("789")
}
point before(test.Do(c Context)) {
= context.WithValue(, "date", time.Now())
}
文件分成两部分,
- 添加import依赖
- 对应的point切入点信息,下文是对其的解释
//固定值point 织入方式 对应的函数 方法参数
point before(test.Do(c Context)) {
// 织入的代码
= context.WithValue(, "date", time.Now())
}
- 织入方式:目前支持 before,after, defer三种方式
- 对应函数:包名.[方法的接收者].函数名,方法接收者如果没有可以不填
- 如果织入的代码中使用到了接收者,接收者的参数为去掉前缀的变量,如test.X.Inject中,使用X,并且需要使用占位符表明接收者
- 方法参数:需要按照代织入的方法参数顺序进行编写,现支持的参数类型,struct(使用对应的类型,不需要带前缀),map,slice,array,func,interface。
point after(test.*X.Inject(c Context, m map, s slice, i interface, f func)) {
- 如果织入的代码中有使用到对应的参数,请使用这样的占位符表明
编译
- xgc build:编译代码,和go build一样,直接执行编译后的文件即可
- xgc debug:生成织入后的代码,用以问题排查,代码存放在$USER_HOME/.xgc下