为了账号安全,请及时绑定邮箱和手机立即绑定

使用 go/ast 包

使用 go/ast 包

Go
慕哥9229398 2021-08-10 13:31:26
我正在尝试在 Go 中进行一些元编程,并且正在尝试使用该go/ast包。这是创建 AST 的代码段:// Create an ASTfooFn := &ast.FuncDecl{    Name: &ast.Ident{Name: "foofn"},    Body: &ast.BlockStmt{        List: []ast.Stmt{&ast.ExprStmt{            X: &ast.CallExpr{                Fun: &ast.Ident{Name: "println"},                Args: []ast.Expr{                    &ast.BasicLit{Kind: token.INT, Value: "42"},                },            },        }},    },}f := &ast.File{    Name:  &ast.Ident{Name: "foopackage"},    Decls: []ast.Decl{fooFn},    Scope: &ast.Scope{        Objects: map[string]*ast.Object{            "Foo": &ast.Object{                Kind: ast.Fun,                Name: "Foo",                Decl: fooFn,            },        },    },}在这里查看完整的代码http://play.golang.org/p/zTJdnqVx__应该会产生这个输出:panic: runtime error: invalid memory address or nil pointer dereference[signal 0xb code=0xffffffff addr=0x0 pc=0x773ae]goroutine 16 [running]:runtime.panic(0x18b5a0, 0x24c8af)    /tmp/sandbox/go/src/pkg/runtime/panic.c:279 +0x120go/ast.(*FuncType).Pos(0x0, 0x1c827eb4, 0xfefd02b8, 0x10422360)    /tmp/sandbox/go/src/pkg/go/ast/ast.go:446 +0x2ego/ast.(*FuncDecl).Pos(0x10422360, 0x10422360, 0x47, 0xfeee1cb0)    /tmp/sandbox/go/src/pkg/go/ast/ast.go:933 +0x40go/printer.(*printer).declList(0x10402840, 0x1040e108, 0x1, 0x1)    /tmp/sandbox/go/src/pkg/go/printer/nodes.go:1587 +0x180go/printer.(*printer).file(0x10402840, 0x10442080)    /tmp/sandbox/go/src/pkg/go/printer/nodes.go:1597 +0x1e0go/printer.(*printer).printNode(0x10402840, 0x184ba0, 0x10442080, 0x104223c0, 0x0, 0x0)    /tmp/sandbox/go/src/pkg/go/printer/printer.go:1087 +0xa40go/printer.(*Config).fprint(0xfeee1e90, 0xfefd02d8, 0x10426180, 0x104181b0, 0x184ba0, 0x10442080, 0x104223c0, 0xfefd02d8, 0x0, 0x0)    /tmp/sandbox/go/src/pkg/go/printer/printer.go:1226 +0xc0go/printer.(*Config).Fprint(0xfeee1e90, 0xfefd02d8, 0x10426180, 0x104181b0, 0x184ba0, 0x10442080, 0x0, 0x0)编辑:这是FuncDelc.Type设置和Scope删除的工作版本(因为我只在源代码缓冲区之后):http://play.golang.org/p/B0Xp61rSce
查看完整描述

1 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

看起来您可能需要ast.FuncType为您的ast.FuncDecl. 错误似乎是调用的结果IsValid()Func你的(零)的财产FuncType


查看完整回答
反对 回复 2021-08-10
  • 1 回答
  • 0 关注
  • 354 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信