Menu
Coddy logo textTech

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

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

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

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

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

Когда вы создаёте struct, любое поле, которому вы явно не присвоили значение, получает своё нулевое значение.

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
}

Это также относится к partial initialization. Only указанные вами fields получают пользовательские значения.

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

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

challenge icon

Задание

Легко

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

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

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

Будет предоставлен following input:

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

Ваш method DisplayProfile should return string в точно таком формате:

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

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

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

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

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

package main

import (
	"fmt"
)

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

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

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go