Функция создания в Go
Готовое значение собирают отдельной функцией
и возвращают указатель. Это обычная функция
уровня файла, не метод: имя часто начинается
с New и типа, параметры задают поля,
в теле создают литерал и берут его адрес.
Запишем функцию, которая создает пользователя:
type User struct {
Name string
Age int
}
func NewUser(name string, age int) *User {
return &User{Name: name, Age: age}
}
Создадим значение через эту функцию:
u := NewUser("ann", 20)
fmt.Println(u.Name, u.Age)
В u лежит указатель на структуру с
полями "ann" и 20. К полям
обращаются через точку, как у обычной переменной:
язык сам разыменовывает указатель при чтении.
Такую функцию удобно держать рядом с типом,
когда литерал повторяется или нужно всегда
возвращать один и тот же формат значения.
Дальше к полученному указателю можно вызывать
методы с получателем *User.
Дан тип:
package main
import "fmt"
type User struct {
Name string
Age int
}
Запишите функцию с именем NewUser,
которая принимает имя и возраст и возвращает
указатель на литерал. Создайте значение
"kate" и 19 и выведите оба
поля.
Объявите Box с полем Weight,
функцию NewBox с одним параметром
и метод указателя, который увеличивает вес
на 1. Проверьте цепочку создания
и вызова.
Чем функция NewUser отличается от
метода на типе User?