如何在Golang中将ast.TypeSpec声明为int类型?

时间:2016-10-26 15:13:36

标签: go reflection

我有以下Golang文档解析代码。 “ts”是ast.TypeSpec。我可以检查StructType等。但是,ts.Type是“int”。我怎样才能断言int和其他基本类型?

ts, ok := d.Decl.(*ast.TypeSpec)
switch ts.Type.(type) {
case *ast.StructType:
    fmt.Println("StructType")
case *ast.ArrayType:
    fmt.Println("ArrayType")
case *ast.InterfaceType:
    fmt.Println("InterfaceType")
case *ast.MapType:
    fmt.Println("MapType")
}

1 个答案:

答案 0 :(得分:2)

AST中的类型表示用于声明类型而不是实际类型的语法。例如:

type t struct { }

var a int          // TypeSpec.Type is *ast.Ident
var b struct { }   // TypeSpec.Type is *ast.StructType
var c t            // TypeSpec.Type is *ast.Ident, but c variable is a struct type

我发现在尝试理解不同语法的表示时打印示例AST很有帮助。 Run this program to see an example

在大多数情况下,此代码将检查整数,但不能可靠地执行:

if id, ok := ts.Type.(*ast.Ident); ok {
    if id.Name == "int" {
        // it might be an int
    }
}

以下情况的代码不正确:

type myint int
var a myint          // the underlying type of a is int, but it's not declared as int

type int anotherType 
var b int            // b is anotherType, not the predeclared int type

要在源中可靠地找到实际类型,请使用go/types包。 A tutorial on the package is available