1 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
接口值確實(shí)是可比較的,但是您只能比較可相互賦值的值(更準(zhǔn)確地說(shuō),一個(gè)是可賦值給另一個(gè)的)。引用自規(guī)范:比較運(yùn)算符:
在任何比較中,第一個(gè)操作數(shù)必須可分配給第二個(gè)操作數(shù)的類(lèi)型,反之亦然。
您不能error
為 an 賦值io.Reader
,也不能io.Reader
為 an 賦值error
,因此無(wú)法比較它們。
它們可能存儲(chǔ)也可能不存儲(chǔ)相同的動(dòng)態(tài)值,如果你想比較它們,首先將兩者都隱藏到interface{}
,這樣你就可以比較它們,例如:
fmt.Println(interface{}(err)?==?interface{}(reader))
這將輸出(在Go Playground上嘗試):
true
注意:實(shí)際上只將其中一個(gè)轉(zhuǎn)換為 就足夠了interface{}
,因?yàn)檫@樣另一個(gè)值將與您轉(zhuǎn)換為的值的類(lèi)型相當(dāng)interface{}
(任何值都可以轉(zhuǎn)換為interface{}
),所以這樣做也足夠了:
fmt.Println(interface{}(err)?==?reader)
測(cè)試與非接口值的比較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))
現(xiàn)在輸出將是(在Go Playground上嘗試):
true false
也不要忘記nil
接口值不等于nil
持有nil
動(dòng)態(tài)值的非接口值。
編輯:
包fmt
打印接口內(nèi)的值,而不是接口值。引用包文檔fmt
:
無(wú)論動(dòng)詞如何,如果操作數(shù)是接口值,則使用內(nèi)部具體值,而不是接口本身。
同樣適用于reflect.TypeOf()
:它返回動(dòng)態(tài)類(lèi)型,但如果您將nil
接口值傳遞給它,它會(huì)返回nil
,因此fmt
包將打印nil
。引用它的文檔:
TypeOf 返回表示 i 的動(dòng)態(tài)類(lèi)型的反射類(lèi)型。如果 i 是 nil 接口值,則 TypeOf 返回 nil。
- 1 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報(bào)