这篇文章主要讲解了“Golang怎么用AST实现AOP功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang怎么用AST实现AOP功能”吧!
示例代码
package mainimport ("go/ast""go/parser""go/printer""go/token""log""os")func main() {src := `package maintype MyStruct struct {Field1 intField2 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 maintype MyStruct struct {Field1intField2string}func (m *MyStruct) Method1() {log.Println("Entering Method1")println(m.Field1)}func (m *MyStruct) Method2() {log.Println("Entering Method2")println(m.Field2)}
感谢各位的阅读,以上就是“Golang怎么用AST实现AOP功能”的内容了,经过本文的学习后,相信大家对Golang怎么用AST实现AOP功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!