Каков идиоматический способ встраивания в Go (в отличие от классического ООП)? - PullRequest
0 голосов
/ 09 октября 2019

Я создаю интернет-магазин и хочу найти самый идиоматический способ структурирования своих типов.

Я встраиваю тип Game, потому что другие типы игр почти имеют одинаковый наборполя и методы.

type GameDetails struct {
  Title string
  Price int
}

func (g *GameDetails) String() string {
  return g.Title
}

func (g *GameDetails) Tax(ratio float64) {
  g.Price = float64(g.Price) * ratio
}

// other Game methods...

type BoardGame struct {
  GameDetails
}

type OnlineGame struct {
  GameDetails
}

type VideoGame struct {
  GameDetails
  Genre string
}

func (g *OnlineGame) String() string {
  return g.Title +", "+ g.Genre
}

Я представляю игры в интерфейсе, чтобы я мог использовать их вместе:

type Game interface {
  String() string
  Tax(ratio float64)
}

func main() {
  games := []Game{
    &VideoGame{...},
    &BoardGame{...},
    &OnlineGame{...},
  }

  // ... print games to a user
}

Я могу легко маршалировать игры как JSON, и я 'Я реализую метод UnmarshalJSON в конкретном фрагменте, чтобы вернуть конкретные игры из JSON.

type Games []Game

func (g *Games) UnmarshalJSON(data []byte) error {
  // ...
}

Мой вопрос: это идиоматический способ структурирования моего кода? Каков наилучший способ структурировать мой код с использованием идиом Go?

Мне кажется, что я строю иерархию наследования, а не сочиняю. Как избавиться от моих старых привычек ООП? Можете ли вы показать мне пример? Что не так с этим кодом?

Я читаю другие ответы, но люди только говорят: «Не делай этого в Go, нет наследования» и т. Д. Я знаю это, но я не смог найти хорошийПример для объяснения этого в примере кода.


Для тех, кто читает этот вопрос, есть аналогичные реализации в пакетах testing и template .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...