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

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

Golang中空接口的比較

Golang中空接口的比較

Go
人到中年有點甜 2023-05-22 17:42:24
根據規范:接口值具有可比性。如果兩個接口值具有相同的動態類型和相等的動態值,或者兩者的值為 nil,則它們是相等的。var?err?error? var?reader?io.Reader據了解,err和reader具有不同的動態類型(error和io.Reader),因此沒有可比性。fmt.Println(err?==?reader)會導致編譯錯誤:無效操作:err == reader(錯誤類型與 io.Reader 不匹配)如果是這樣,為什么Println命令對兩個變量輸出相同的結果?為什么兩者都是nil?fmt.Printf("reader:?%T",?reader)?//?nil fmt.Printf("error:?%T",?err)?//?nil編輯?reflect.TypeOf(err)或reflect.TypeOf(reader)也將輸出nil.?我不明白如果類型不同,為什么輸出相同。
查看完整描述

1 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

接口值確實是可比較的,但是您只能比較可相互賦值的值(更準確地說,一個是可賦值給另一個的)。引用自規范:比較運算符:

在任何比較中,第一個操作數必須可分配給第二個操作數的類型,反之亦然。

您不能error為 an 賦值io.Reader,也不能io.Reader為 an 賦值error,因此無法比較它們。

它們可能存儲也可能不存儲相同的動態值,如果你想比較它們,首先將兩者都隱藏到interface{},這樣你就可以比較它們,例如:

fmt.Println(interface{}(err)?==?interface{}(reader))

這將輸出(在Go Playground上嘗試):

true

注意:實際上只將其中一個轉換為 就足夠了interface{},因為這樣另一個值將與您轉換為的值的類型相當interface{}(任何值都可以轉換為interface{}),所以這樣做也足夠了:

fmt.Println(interface{}(err)?==?reader)

測試與非接口值的比較nil

type x int


func (x) Error() string? ? ? ? ? ? { return "" }

func (x) Read([]byte) (int, error) { return 0, nil }


err = x(0)

reader = x(0)

fmt.Println(interface{}(err) == interface{}(reader))


reader = x(1)

fmt.Println(interface{}(err) == interface{}(reader))

現在輸出將是(在Go Playground上嘗試):

true
false

也不要忘記nil接口值不等于nil持有nil動態值的非接口值。

編輯:

fmt打印接口內的值,而不是接口值。引用包文檔fmt

無論動詞如何,如果操作數是接口值,則使用內部具體值,而不是接口本身。

同樣適用于reflect.TypeOf():它返回動態類型,但如果您將nil接口值傳遞給它,它會返回nil,因此fmt包將打印nil。引用它的文檔:

TypeOf 返回表示 i 的動態類型的反射類型。如果 i 是 nil 接口值,則 TypeOf 返回 nil。


查看完整回答
反對 回復 2023-05-22
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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