Сайт работает в тестовом режиме - все замечания, предложения и информацию о найденных ошибках направляйте, пожалуйста, в Telegram-группу
Курс в процессе наполнения. Полный курс доступен на Степике

Баг: Забыл, что у неинициализированной переменной есть значение

Новички думают, что если они написали var count int, то переменная "пустая" или "не содержит значения". Но это не так — у неё уже есть нулевое значение (zero value).

Пример ошибки (логическая, не синтаксическая):

package main
import "fmt"

func main() {
    var age int        // zero value = 0
    var name = "Гофи"  // явно задано

    // Забыли прочитать ввод или присвоить возраст
    fmt.Println(name, "возраст:", age) 
    // 🐛 Выведет: Гофи возраст: 0
}

Новичок думает: "Я не задавал возраст, значит, программа должна остановиться или показать 'пусто'".
В Go var age intсразу кладёт 0. Компилятор молчит, программа работает, а результат враньё. На реальных данных это значит:

  • 0 лет → индивидуум считается новорождённым, хотя ему 14

  • 0 рублей → скидка 100%, а должна быть 10%

  • "" → логин пустой, но система "пропускает" дальше

Главный урок на этом этапе

В Go нет состояния "не задано". Есть только "я не написал, поэтому язык подставил значение по умолчанию".
Если видишь var x int → в памяти уже лежит 0. Если var s string → уже лежит "".
Твоя задача: всегда явно задавать начальное значение, если оно не равно zero value, или осознанно использовать его.

Почему Go так делает?

Это не баг, а защита от неопределённости. В некоторых языках неинициализированная переменная содержит "мусор" из памяти → программа может работать сегодня, а завтра упасть.

Go гарантирует: что написал, то и получил.

  • 0 предсказуем.

  • " " предсказуем.

  • false предсказуем.

Загрузка...