2013 подписчиков
👣 Что возвращать в Go: структуры или интерфейсы?
Возвращение структур
Рассмотрим преимущества возвращения структур из функций Go: эксплицитность, гибкость, прямой контроль над полями и методами объекта.
Изучим потенциальный недостаток — сильную связанность — и выработаем стратегии эффективного ограничения его влияния.
Преимущества и особенности возвращения структур Go с учетом потенциальных проблем сильной связанности пригодятся для создания хорошо структурированного, сопровождаемого кода.
Эксплицитность
Для возвращаемой структуры характерны четкая видимость, доступ к ее полям и методам. Это как подробная схема, на которой раскрываются все нюансы объекта.
Получая прямой доступ к свойствам структуры, мы имеем четкое представление о том, что внутри нее, поэтому работа с данными, манипулирование ими упрощаются.
Рассмотрим пример:
type Person struct {
Name string
Age int
Email string
}
func NewPerson(name string, age int, email string) Person {
return Person{
Name: name,
Age: age,
Email: email,
}
}
func main() {
person := NewPerson("John Doe", 30, "john.doe@example.com")
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
fmt.Println("Email:", person.Email)
}
В функции NewPerson возвращается структура Person с информацией о человеке. Возвращая структуру напрямую, мы получаем явный доступ к ее полям Name, Age, Email в вызывном коде.
Благодаря такой эксплицитности необходимые данные легко извлечь и использовать.
Гибкость
Возвращаемыми структурами обеспечиваются непревзойденные контроль и гибкость при определении конкретных поведений и методов. Структура проектируется с именно таким функционалом, который требуется.
Благодаря возможности адаптировать ее к конкретным требованиям, код получается чище, целенаправленнее и с точным соответствием задачам приложения.
Продемонстрируем эту гибкость, обновив пример выше:
type Person struct {
Name string
Age int
Email string
}
func (p Person) Greet() {
fmt.Println("Hello, my name is", p.Name)
}
func main() {
person := Person{
Name: "John Doe",
Age: 30,
Email: "john.doe@example.com",
}
person.Greet()
}
В структуру Person добавили метод Greet. Возвращая структуру, мы определяем конкретное поведение прямо в ее типе. В методе Greet приветствие персонализируется полем Name структуры Person.
Благодаря такой гибкости поведения инкапсулируются в самой структуре, а код чище и проще в сопровождении.
1 минута
19 сентября 2023