Menu
Coddy logo textTech

Функция new()

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

Go предоставляет встроенную функцию new(), которая выделяет память для типа и возвращает указатель на неё. Выделенная память инициализируется нулевым значением типа.

p := new(int)      // выделяет память для int
fmt.Println(*p)    // 0 (нулевое значение)
fmt.Println(p)     // 0xc000018030 (адрес памяти)

Функция new() принимает тип в качестве аргумента и возвращает указатель на только что выделенное нулевое значение этого типа. Это особенно полезно, когда вам нужен pointer, но у вас нет существующей переменной, на которую можно было бы сослаться.

Для структур new() создаёт указатель на структуру, у которой все поля установлены в нулевые значения.

type Person struct {
    Name string
    Age  int
}

p := new(Person)
fmt.Println(p.Name)  // "" (пустая строка)
fmt.Println(p.Age)   // 0

Возможно, вы задаётесь вопросом, когда использовать new(), а когда оператор получения адреса &. Оба приведённых ниже подхода эквивалентны:

// Использование new()
p1 := new(Person)

// Использование оператора адреса с литералом
p2 := &Person{}

Синтаксис &Person{} чаще используется на практике, поскольку позволяет одновременно инициализировать fields. Используйте new(), когда вам нужен экземпляр с нулевыми значениями и вы предпочитаете явную семантику выделения memory.

challenge icon

Задание

Легко

Давайте создадим менеджер конфигурации, который демонстрирует, как new() выделяет память и инициализирует структуры их нулевыми значениями. Вы увидите, чем этот подход отличается от использования оператора адреса с литералом структуры.

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

  • config.go: Определите структуру ServerConfig с полями Host (string), Port (int), MaxConnections (int) и DebugMode (bool). Создайте две функции:
    • NewServerConfig, которая использует new() для выделения памяти под ServerConfig и напрямую возвращает указатель (со всеми нулевыми значениями)
    • ConfigureServer, которая принимает указатель *ServerConfig, а также строку host и целое число port, после чего устанавливает эти поля в config через указатель
    Также добавьте метод Display для *ServerConfig, который возвращает форматированную строку со всеми значениями конфигурации.
  • main.go: Считайте host и port из входных данных. Сначала создайте config с помощью NewServerConfig() и выведите его, чтобы показать нулевые значения. Затем используйте ConfigureServer, чтобы установить host и port, и снова выведите config, чтобы показать обновлённые значения.

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

  • Строка 1: имя host (string)
  • Строка 2: номер port (целое число)

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

Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]

Выведите результат работы метода дважды: один раз до настройки (с нулевыми значениями), а второй раз после настройки (с обновлёнными host и port).

Например, если заданы localhost и 8080, результат должен быть следующим:

Host: 
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: false

Обратите внимание, что первый вывод показывает все нулевые значения (empty строка, 0, 0, false), поскольку new() инициализирует всё нулевыми значениями. После вызова ConfigureServer изменяются только host и port, а остальные поля сохраняют свои нулевые значения.

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

package main

import (
	"fmt"
)

func main() {
	// Читать ввод
	var host string
	var port int
	fmt.Scanln(&host)
	fmt.Scanln(&port)

	// TODO: Создать конфигурацию с помощью NewServerConfig() и отобразить её
	// Это покажет нулевые значения

	// TODO: Использовать ConfigureServer для установки host и port

	// TODO: Отобразить конфигурацию снова, чтобы показать обновлённые значения
}
quiz iconПроверьте себя

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

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

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