Một interface value trong Go gồm hai phần: (kiểu động, giá trị động). Interface chỉ bằng nil khi cả hai phần đều nil.
Nếu bạn gán một con trỏ nil có kiểu cụ thể (vd *MyError) vào một biến error, interface giữ kiểu ≠ nil (dù value là nil). So sánh != nil khi đó ra true — trái với kỳ vọng. Đây là bẫy typed-nil thường gặp khi trả *MyError qua kiểu error.
go
func do() error {
var e *MyError = nil
return e // interface = (*MyError, nil) — KHÔNG nil!
}
if do() != nil { // chạy vào đây, sai kỳ vọng
// ...
}Cách tránh: trả thẳng nil khi không có lỗi, hoặc khai báo biến kiểu error ngay từ đầu chứ đừng dùng con trỏ cụ thể.