【发布时间】:2020-12-29 12:34:06
【问题描述】:
在下面的示例中,根据types.Identical(),从GetTime() 返回的time 类型与time.Time 不同。为什么是这样?这两种类型在打印时都是time.Time。
package main
import (
"fmt"
"go/ast"
"go/importer"
"go/parser"
"go/token"
"go/types"
"golang.org/x/tools/go/packages"
)
const example = `package main
import "time"
func GetTime() time.Time {
return time.Time{}
}
func main() {
}`
func GetTimeObject() types.Object {
cfg := &packages.Config{
Mode: packages.LoadAllSyntax,
}
loadedPackages, err := packages.Load(cfg, "time")
if err != nil {
panic(err)
}
timePkg := loadedPackages[0]
timeObject := timePkg.Types.Scope().Lookup("Time")
return timeObject
}
func main() {
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, "example.go", example, 0)
if err != nil {
panic(err)
}
conf := types.Config{Importer: importer.Default()}
pkg, err := conf.Check("example", fset, []*ast.File{f}, nil)
if err != nil {
panic(err)
}
getTimeObj := pkg.Scope().Lookup("GetTime")
if getTimeObj == nil {
panic("not found")
}
switch t := getTimeObj.Type().(type) {
case *types.Signature:
results := t.Results()
if results.Len() != 1 {
panic("unexpected")
}
retObject := results.At(0)
timeObject := GetTimeObject()
fmt.Printf("time type: %v\n", timeObject.Type()) // time.Time
fmt.Printf("return type: %v\n", retObject.Type()) // time.Time
fmt.Printf("identical: %t\n", types.Identical(timeObject.Type(), retObject.Type())) // false
default:
panic("unexpected")
}
}
【问题讨论】:
标签: go types abstract-syntax-tree