TGViewer
Go tests Go tests @golangtests · 7.84K subscribers
Post #899 3.21K
В Go nil - это не просто «пусто».
Иногда это причина самых странных багов в продакшене.

nil в Go - это не одно значение, а множество разных nil.


1. Interface и nil — ловушка


var err error = nil
fmt.Println(err == nil) // true

var e *MyError = nil
var err error = e
fmt.Println(err == nil) // false (!)


Почему так?

Интерфейс в Go хранит:

• тип
• значение

В этом случае:

• тип = *MyError

• значение = nil

Интерфейс не nil, потому что тип задан.

Именно так появляются ошибки вида:

if err != nil срабатывает

но внутри на самом деле nil


2. Typed nil vs untyped nil
var p *int = nil
var s []int = nil
var m map[string]int = nil


Все они nil, но разных типов.
И Go сравнивает не только значение, но и тип.


3. Panic из-за nil внутри interface
type User struct{}

func (u *User) Name() string {
return "John"
}

var u *User = nil
var i interface{} = u

i.(*User).Name() // panic


Интерфейс не nil → метод вызывается → внутри nil → panic.

4. Частый баг с error

Плохой код:

func do() error {
var e *MyError = nil
return e
}


Правильно:

func do() error {
if somethingWrong {
return &MyError{}
}
return nil
}

Главное правило

Если работаешь с interface:
• всегда проверяй, что возвращаешь чистый nil

помни:

interface != nil, если внутри typed nil


https://sushantdhiman.dev/nil-in-go-is-not-what-you-think/
  • ❤ 6
  • 👍 5
  • 🔥 4
More from @golangtests
  1. Sep 23, 2026Задача по Go: `select` и побочные эффекты Что выведет программа? package main import "fmt"…
  2. Sep 23, 2026Не застревайте в прошлом — учитесь новым навыкам и ИИ Чтобы успевать за требованиями рынка…
  3. Sep 13, 2026👣 Задача на Go 1.27: concurrent job scheduler с generic methods Нужно реализовать библиот…
  4. Sep 13, 2026🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку Можно годами смотреть…
  5. Sep 2, 2026👣 Go 1.27: почему две разные closure внезапно могут иметь одинаковый адрес функции? Что в…
  6. Aug 21, 2026Go-задача: что выведет этот код? package main import "fmt" func main() { var funcs []func(…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →