gpt4 book ai didi

go - 使用 go/ast 包

转载 作者:IT王子 更新时间:2023-10-29 01:27:41 29 4
gpt4 key购买 nike

我正在尝试在 Go 中进行一些元编程,并且正在尝试使用 go/ast 包。

这是创建 AST 的代码片段:

// Create an AST
fooFn := &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 +0x120
go/ast.(*FuncType).Pos(0x0, 0x1c827eb4, 0xfefd02b8, 0x10422360)
/tmp/sandbox/go/src/pkg/go/ast/ast.go:446 +0x2e
go/ast.(*FuncDecl).Pos(0x10422360, 0x10422360, 0x47, 0xfeee1cb0)
/tmp/sandbox/go/src/pkg/go/ast/ast.go:933 +0x40
go/printer.(*printer).declList(0x10402840, 0x1040e108, 0x1, 0x1)
/tmp/sandbox/go/src/pkg/go/printer/nodes.go:1587 +0x180
go/printer.(*printer).file(0x10402840, 0x10442080)
/tmp/sandbox/go/src/pkg/go/printer/nodes.go:1597 +0x1e0
go/printer.(*printer).printNode(0x10402840, 0x184ba0, 0x10442080, 0x104223c0, 0x0, 0x0)
/tmp/sandbox/go/src/pkg/go/printer/printer.go:1087 +0xa40
go/printer.(*Config).fprint(0xfeee1e90, 0xfefd02d8, 0x10426180, 0x104181b0, 0x184ba0, 0x10442080, 0x104223c0, 0xfefd02d8, 0x0, 0x0)
/tmp/sandbox/go/src/pkg/go/printer/printer.go:1226 +0xc0
go/printer.(*Config).Fprint(0xfeee1e90, 0xfefd02d8, 0x10426180, 0x104181b0, 0x184ba0, 0x10442080, 0x0, 0x0)
/tmp/sandbox/go/src/pkg/go/printer/printer.go:1284 +0xa0
main.main()
/tmpfs/gosandbox-eb231fa6_4e4e43ec_79a6f993_ce4170ce_07ee185b/prog.go:46 +0x8c0

编辑:这里是设置了 FuncDelc.Type 并删除了 Scope 的工作版本(因为我只是在源代码缓冲区之后):

http://play.golang.org/p/B0Xp61rSce

最佳答案

看起来您可能需要为您的 ast.FuncDecl 提供一个 ast.FuncType。该错误似乎是在您的 (nil) FuncTypeFunc 属性上调用 IsValid() 的结果。

关于go - 使用 go/ast 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25263094/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com