为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
陪伴而非守候 2023-04-24 15:58:13
我写了一些代码来通过“go/types”获得特殊类型import (    "go/ast"    "go/importer"    "go/parser"    "go/token"    "go/types"    "log")    const (    Src = `package typesimport (    "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)))结果是falsefalsetruetrue似乎types.Identical无法比较其他包中的两个相同类型?我如何比较它们?够types.TypeString(typ1, nil) == types.TypeString(typ2, nil)坚固吗?
查看完整描述

2 回答

?
德玛西亚99

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)))

}


查看完整回答
反对 回复 2023-04-24
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

Go 中具有不同名称的类型被视为不同,即使它们具有相同的结构。

如果你想比较它们,你可以将一个值转换为另一种类型:

     type A {...} // some declaration

     type B {...} // the same declaration 

     if a == A(b) {...}


查看完整回答
反对 回复 2023-04-24
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信