猿问

go/types.Identical 不能比较其他包中的两个相同类型?

我写了一些代码来通过“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)坚固吗?


陪伴而非守候
浏览 115回答 2
2回答

德玛西亚99

要解决您的问题,您必须解析一次源代码,然后共享生成的*types.Package.package mainimport (    "go/ast"    "go/importer"    "go/parser"    "go/token"    "go/types"    "log")const Src = `package typesimport (    "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)))}

繁花不似锦

Go 中具有不同名称的类型被视为不同,即使它们具有相同的结构。如果你想比较它们,你可以将一个值转换为另一种类型:     type A {...} // some declaration      type B {...} // the same declaration       if a == A(b) {...}
随时随地看视频慕课网APP

相关分类

Go
我要回答