interface類型的錯誤判斷
對于interface
類型的數(shù)據(jù)霉囚,建議不要通過簡單的interface == nil
進(jìn)行判斷柄粹,否則會出現(xiàn)誤判粥惧。
func main() {
var data *byte
var in interface{}
fmt.Println(data, data == nil) // nil,true, 可以正確判斷
fmt.Println(in, in == nil) // nil,true, 可以正確判斷
in = data
fmt.Println(in, in == nil) // nil,false, 無法正確判斷
fmt.Println(in, reflect.ValueOf(in).IsNil()) // nil,true, 通過此方法可以正確判斷interface類型nil值
}
即使該interface類型值確實(shí)為nil键畴,但是通過==
是無法判斷出來的,需要使用reflect.ValueOf
突雪。
原理
interface類型并不是一個指針類型起惕,它包含兩類數(shù)據(jù)結(jié)構(gòu):
-
runtime.eface
結(jié)構(gòu)體:表示不包含任何方法的空接口,也稱為 empty interface -
runtime.iface
結(jié)構(gòu)體:表示包含方法的接口
即一個interface包含了一個類型和一個值咏删。使用==
判斷interface是否為nil時惹想,會同時判斷類型和值是否均為nil,只有當(dāng)類型和值均為nil的情況下饵婆,==才會判斷為nil
在上文中勺馆,我們?yōu)橹羔樫x值了一個零值的指針類型,導(dǎo)致類型不為空侨核,進(jìn)而導(dǎo)致==誤判草穆,所以此時需要reflect來進(jìn)行正確的判斷。