2 回答
TA贡献1770条经验 获得超3个赞
要解决您的问题,您必须解析一次源代码,然后共享生成的*types.Package
.
package main
import (
"go/ast"
"go/importer"
"go/parser"
"go/token"
"go/types"
"log"
)
const Src = `
package types
import (
"io"
"net/http"
)
var (
IOReader io.Reader
Response *http.Response
)
`
const (
TypeIOReader = "IOReader"
TypeResponse = "Response"
)
func GetType(name string, pkg *types.Package) types.Type {
return pkg.Scope().Lookup(name).Type()
}
func main() {
fset := token.NewFileSet()
file, err := parser.ParseFile(fset, "types.go", Src, 0)
if err != nil {
panic(err)
}
conf := types.Config{Importer: importer.Default()}
pkg, err := conf.Check("impler/types", fset, []*ast.File{file}, nil)
if err != nil {
panic(err)
}
log.Println(types.Identical(GetType(TypeResponse, pkg), GetType(TypeResponse, pkg)))
log.Println(types.Identical(GetType(TypeIOReader, pkg), GetType(TypeIOReader, pkg)))
}
TA贡献1851条经验 获得超4个赞
Go 中具有不同名称的类型被视为不同,即使它们具有相同的结构。
如果你想比较它们,你可以将一个值转换为另一种类型:
type A {...} // some declaration type B {...} // the same declaration if a == A(b) {...}
- 2 回答
- 0 关注
- 103 浏览
添加回答
举报