我写了一些代码来通过“go/types”获得特殊类型
import (
"go/ast"
"go/importer"
"go/parser"
"go/token"
"go/types"
"log"
)
const (
Src = `
package types
import (
"io"
"net/http"
)
var (
IOReader io.Reader
Err error
StatusCode int
Request *http.Request
Response *http.Response
)
`
)
const (
TypeIOReader = "IOReader"
TypeErr = "Err"
TypeStatusCode = "StatusCode"
TypeRequest = "Request"
TypeResponse = "Response"
)
func GetType(name string) types.Type {
fset := token.NewFileSet()
file, err := parser.ParseFile(fset, "types.go", Src, 0)
if err != nil {
log.Fatal(err)
}
conf := types.Config{Importer: importer.Default()}
pkg, err := conf.Check("impler/types", fset, []*ast.File{file}, nil)
return pkg.Scope().Lookup(name).Type()
}
功能GetType(name string) types.Type可以做到。
当我比较两种类型时,我得到了一些奇怪的结果
log.Println(types.Identical(GetType(TypeResponse), GetType(TypeResponse)))
log.Println(types.Identical(GetType(TypeIOReader), GetType(TypeIOReader)))
log.Println(types.Identical(GetType(TypeStatusCode), GetType(TypeStatusCode)))
log.Println(types.Identical(GetType(TypeErr), GetType(TypeErr)))
结果是
false
false
true
true
似乎types.Identical无法比较其他包中的两个相同类型?我如何比较它们?
够types.TypeString(typ1, nil) == types.TypeString(typ2, nil)坚固吗?
德玛西亚99
繁花不似锦
相关分类