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。
- 1 回答
- 0 關注
- 128 瀏覽
添加回答
舉報