Go-interface与nil的经典面试陷阱全解文章导语“以下代码输出什么”——这是Go面试中最经典的interfacenil陷阱题。本文从interface底层结构出发彻底解决所有interface相关的面试困惑。一、经典面试题funcGetError()error{varp*MyErrornilreturnp// 返回什么}funcmain(){err:GetError()fmt.Println(errnil)// false}原因interface底层是(type, value)当p赋给err时type*MyError且不为nil即使valuenil整个interface也不为nil。二、其他interface陷阱// 陷阱2空接口的类型断言variinterface{}42s:i.(string)// panic// 安全写法ifs,ok:i.(string);ok{...}// 陷阱3nil接口 vs nil指针varw io.Writer// nil接口type和value都nilvarb*bytes.Buffer// nil指针wb// w不再是nil接口三、全文总结interface的nil判断要看type和value两字段。return nil指针给interface返回值是Go面试第一杀手题。参考文献Go Blog - Laws of ReflectionGo源码 runtime/iface.go