亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號