@AndrewRusinas

Можно ли избавиться от избыточных типов (struct) в Golang?

Я делаю простенькую апишку для блога на голанге.
У меня есть простой тип для записи блога:
type Post struct {
  title string
  author string
  category string
}


Проблема в том, что есть разные эндпоинты, которые могут возвращать запись из блога, но с разным набором полей. Например, в некоторых случаях я хочу, чтобы записи содержали инфу об авторе, в других случаях, чтобы инфу о категории, а в третьих и то, и другое.

Иными словами, для каждого из кейсов придётся заводить разные типы? Задача тривиальная и кажется есть способы лучше. Пока что мой код выглядит примерно так:
type Post struct {
  title string
  author string
  category string
}

type Author struct {
  firstname string
  lastname string
}

type Category struct {
  name string
  parent Category
}

type PostWithAuthor struct {
  title string
  author Author
  category string
}

type PostWithCategory struct {
  title string
  author string
  category Author
}

type PostWithAuthorAndCategory struct {
  title string
  author Author
  category Category
}


func getPost() (Post) {
  
}

func getPostWithCategory() (PostWithCategory) {

}

func getPostWithAuthor() (PostWithAuthor) {

}

func getPostWithAuthorAndCategory() (PostWithAuthorAndCategory) {

}


Однако, если таких полей, которые можно будет джойнить, будет больше, то и количество комбинаций будет расти экспоненциально. Как-то тупо выходит :( Одна только возня с неймингом этих типов будет болью.

Полагаю, есть способ не типизировать возвращаемые данные, а отдавать какой-нибудь bson.M (у меня монга), но тогда в чем смысл будет вообще использовать го.

Так как я использую монгу, то если я попробую передать не тот тип, то всё упадёт.
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 1
@deliro
Либо делать несколько типов, либо один супер-тип, который будет содержать все возможные поля, часть из которых будет nil'ами, если не пришла из апи. У го очень тупорылая система типов, ни о каких ADT речи нет
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы