登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [ast]纯干货:用golang ast实现aop[zt]     [回主站]     [分站链接]
[ast]纯干货:用golang ast实现aop[zt]
clq
浏览(181) - 2023-04-02 17:58:08 发表 编辑

关键字:

[ast]纯干货:用golang ast实现aop[zt]

https://juejin.cn/post/7211401380770234427

----------------------------------------------------------------
纯干货:用golang ast实现aop
行云流水落风雪 lv-3
2023年03月17日 16:13 · 阅读 22
简述

本文全是简单的干货,直接让我们知道如何实现一个AOP功能。在这个示例中,我们定义了一个名为 MyStruct 的结构体,它有两个字段和两个方法。然后,我们使用 Golang 的 AST 包来遍历源代码的 AST,并找到名为 MyStruct 的结构体的方法。

对于每个方法,我们创建一个新的日志语句,并将其插入到方法体的开头。这样,在调用该方法时,就会自动打印出一条日志信息。

最后,我们使用 Golang 的 printer.Fprint 函数将新生成的 AST 节点输出为 Go 代码。

希望这个示例能够帮助您了解如何使用 Golang 的 AST 包来实现 AOP。

package main

import (
"go/ast"
"go/parser"
"go/printer"
"go/token"
"log"
"os"
)

func main() {
src := `package main

type MyStruct struct {
Field1 int
Field2 string
}

func (m *MyStruct) Method1() {
println(m.Field1)
}

func (m *MyStruct) Method2() {
println(m.Field2)
}
`
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, "", src, 0)
if err != nil {
log.Fatal(err)
}

ast.Inspect(f, func(n ast.Node) bool {
switch x := n.(type) {
case *ast.FuncDecl:
if x.Recv != nil && len(x.Recv.List) == 1 && x.Recv.List[0].Names[0].Name == "m" && x.Recv.List[0].Type.(*ast.StarExpr).X.(*ast.Ident).Name == "MyStruct" {

logStmt := &ast.ExprStmt{
X: &ast.CallExpr{
Fun: &ast.SelectorExpr{
X: ast.NewIdent("log"),
Sel: ast.NewIdent("Println"),
},
Args: []ast.Expr{&ast.BasicLit{
ValuePos: x.Pos(),
Kind: token.STRING,
Value: "\"Entering " + x.Name.Name + "\"",
}},
},
}

x.Body.List = append([]ast.Stmt{logStmt}, x.Body.List...)
return false
}

}
return true
})

printer.Fprint(os.Stdout, fset, f)
}


//----------------输出
package main

type MyStruct struct {
Field1 int
Field2 string
}

func (m *MyStruct) Method1() {
log.Println("Entering Method1")
println(m.Field1)
}

func (m *MyStruct) Method2() {
log.Println("Entering Method2")
println(m.Field2)
}




总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录
golang 更多



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1