Menu
Coddy logo textTech

Функции-конструкторы

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

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

Базовая функция-конструктор

type Person struct {
    Name string
    Age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{
        Name: name,
        Age:  age,
    }
}

Конструктор со значениями по умолчанию

type Config struct {
    Host    string
    Port    int
    Timeout int
}

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // Значение по умолчанию
        Timeout: 30,      // Значение по умолчанию
    }
}

Конструктор с валидацией

func NewPerson(name string, age int) *Person {
    if name == "" {
        name = "Unknown"
    }
    if age < 0 {
        age = 0
    }
    return &Person{
        Name: name,
        Age:  age,
    }
}

Использование функций-конструкторов

func main() {
    p1 := NewPerson("Alice", 25)
    fmt.Println(p1.Name) // Alice

    p2 := NewPerson("", -5)
    fmt.Println(p2.Name) // Неизвестно
    fmt.Println(p2.Age)  // 0
}

Функции-конструкторы возвращают указатель (*StructName) с помощью &. Это позволяет избежать копирования структуры и позволяет методам с получателями-указателями работать напрямую. Валидация и значения по умолчанию задаются внутри конструктора.

challenge icon

Задание

Средне

Создайте функцию-конструктор NewBankAccount для структуры BankAccount с валидацией:

  • Принимает name (string) и balance (float64) в качестве параметров
  • Если name пустое, установите значение по умолчанию "Unnamed"
  • Если balance отрицательный, установите значение по умолчанию 0
  • Всегда устанавливайте Owner в "Default Owner"
  • Возвращайте указатель на новую структуру

Шпаргалка

Go использует функции-конструкторы вместо обычных конструкторов. По соглашению их называют NewTypeName и они возвращают указатель на инициализированную структуру.

Базовая функция-конструктор:

type Person struct {
    Name string
    Age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{
        Name: name,
        Age:  age,
    }
}

Конструктор со значениями по умолчанию:

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // Значение по умолчанию
        Timeout: 30,      // Значение по умолчанию
    }
}

Конструктор с валидацией:

func NewPerson(name string, age int) *Person {
    if name == "" {
        name = "Unknown"
    }
    if age < 0 {
        age = 0
    }
    return &Person{
        Name: name,
        Age:  age,
    }
}

Функции-конструкторы возвращают указатель (*StructName), используя &, чтобы избежать копирования структуры и позволить методам с получателем-указателем (pointer receiver) работать напрямую.

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

package main

import "fmt"

func main() {
    var name string
    var balance float64
    fmt.Scan(&name, &balance)

    account := NewBankAccount(name, balance)

    fmt.Printf("Account: %s\n", account.Name)
    fmt.Printf("Balance: %.2f\n", account.Balance)
    fmt.Printf("Owner: %s\n", account.Owner)
}
quiz iconПроверьте себя

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

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