微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Golang怎么用AST实现AOP功能

这篇文章主要讲解了“Golang怎么用AST实现AOP功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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)
}

感谢各位的阅读,以上就是“Golang怎么用AST实现AOP功能”的内容了,经过本文的学习后,相信大家对Golang怎么用AST实现AOP功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程之家,小编将为大家推送更多相关知识点的文章,欢迎关注!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐