Menu
Coddy logo textTech

Нулевые значения и значения по умолчанию

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 17 из 107.

В Go каждая переменная имеет нулевое значение — значение по умолчанию, присваиваемое при объявлении переменной без явной инициализации. Понимание нулевых значений необходимо для работы со структурами, так как неинициализированные поля автоматически получают эти значения по умолчанию.

У каждого типа есть своё нулевое значение:

ТипНулевое значение
int, float640
string"" (пустая строка)
boolfalse
pointer, slice, mapnil

Когда вы создаете структуру, любое поле, которое вы не устанавливаете явно, получает свое нулевое значение (zero value).

type User struct {
    Name   string
    Age    int
    Active bool
}

func main() {
    var u User
    fmt.Println(u.Name)   // "" (empty string)
    fmt.Println(u.Age)    // 0
    fmt.Println(u.Active) // false
}

Это также относится к частичной инициализации. Только указанные вами поля получают пользовательские значения.

u := User{Name: "Alice"}
fmt.Println(u.Age)    // 0
fmt.Println(u.Active) // false

Нулевые значения делают структуры пригодными для использования сразу, без явной инициализации. Однако будьте осторожны со ссылочными типами, такими как срезы и карты — их нулевым значением является nil, что может привести к панике во время выполнения, если вы попытаетесь использовать их без инициализации.

challenge icon

Задание

Легко

Давайте создадим систему профилей игроков, которая демонстрирует, как работают нулевые значения (zero values) в Go. Вы создадите игровой профиль, в котором некоторые поля заданы явно, а другие полагаются на свои значения по умолчанию.

Вы организуете свой код в двух файлах:

  • player.go: Определите структуру Player со следующими полями: Username (string), Level (int), Score (int), IsPremium (bool) и GuildName (string). Также создайте метод DisplayProfile, который возвращает отформатированную строку со всей информацией об игроке.
  • main.go: Считайте имя пользователя из входных данных и создайте Player, используя частичную инициализацию — установите только поле Username. Затем выведите полный профиль, чтобы увидеть, как Go заполняет неустановленные поля их нулевыми значениями.

Будут предоставлены следующие входные данные:

  • Строка 1: Имя пользователя игрока

Ваш метод DisplayProfile должен возвращать строку именно в таком формате:

Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]

Например, если имя пользователя — ShadowKnight, ваш вывод должен содержать имя пользователя вместе со всеми нулевыми значениями для неинициализированных полей:

Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: 

Обратите внимание, что в поле Guild после двоеточия ничего не отображается — это нулевое значение пустой строки. Эта задача поможет вам увидеть, что именно Go присваивает каждому типу, когда вы не указываете явное значение.

Шпаргалка

В Go у каждой переменной есть нулевое значение (zero value) — значение по умолчанию, которое присваивается при объявлении переменной без явной инициализации.

У каждого типа есть свое нулевое значение:

ТипНулевое значение
int, float640
string"" (пустая строка)
boolfalse
pointer, slice, mapnil

При создании структуры любое поле, которое вы не задали явно, получает свое нулевое значение:

type User struct {
    Name   string
    Age    int
    Active bool
}

func main() {
    var u User
    fmt.Println(u.Name)   // "" (пустая строка)
    fmt.Println(u.Age)    // 0
    fmt.Println(u.Active) // false
}

Частичная инициализация — только указанные поля получают пользовательские значения:

u := User{Name: "Alice"}
fmt.Println(u.Age)    // 0
fmt.Println(u.Active) // false

Нулевые значения делают структуры пригодными для использования сразу, без явной инициализации. Будьте осторожны со ссылочными типами, такими как слайсы (slices) и карты (maps) — их нулевое значение равно nil, что может привести к ошибкам во время выполнения (runtime panics), если использовать их без инициализации.

Попробуйте сами

package main

import (
	"fmt"
)

func main() {
	// Считать имя пользователя из ввода
	var username string
	fmt.Scanln(&username)

	// TODO: Создать Player, используя частичную инициализацию
	// Установите только поле Username, позвольте остальным полям использовать значения по умолчанию

	// TODO: Отобразить профиль игрока, используя метод DisplayProfile
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование