Я создаю интернет-магазин и хочу найти самый идиоматический способ структурирования своих типов.
Я встраиваю тип 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 .