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 kinh điển 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ể.