Я пытаюсь выяснить идиоматический способ структурирования моделей в Go, но у меня возникли проблемы с поиском образцов для более крупных приложений типа предприятия (просто много кошек и собак, которые говорят ...).Модели структурирования в Go
Я начал, помещая каждый из моих моделей в отдельный пакет, так что, казалось, производят чистейшую API использовать модели:
import "models/person"
person.New(...) // returns the newly created person
person.GetById(123) // returns a single person
person.GetAll() // returns a list of people
Однако, я столкнулся с проблемой, что мои модели должны слишком много ссылок друг на друга. Я закончил с пакетами, которые выглядят так:
-- File person.go
package Person
import "models/team"
type Person struct {
Name string
Team Team
}
func (p *Person) New(...) *Person {
...
}
-- File team.go
package Team
import "models/person"
type Team struct {
Name string
People []*Person
}
func (t *Team) New(...) *Team {
...
}
Это не работает, потому что теперь у меня есть циклическая ссылка. Должен ли я просто добавлять все эти модели в один и тот же пакет, чтобы API выглядел так?
import "model"
model.NewPerson(...) // returns the newly created person
model.GetPersonById(123) // returns a single person
model.GetAllPeople() // returns a list of people
Или я должен использовать интерфейсы для решения этой проблемы (и если да, то на что они похожи)?
У меня также есть вопросы о том, как обращаться с такими вещами, как соединения с базой данных. Как обычно люди подключают базу данных к своим моделям (напрямую или через какой-то промежуточный объект)? Нужно ли каждому звонку использовать интерфейс для какой-либо базы данных в качестве параметра или есть лучший способ сделать это?
Есть ли более крупный пример структурирования полного API Rest в Go Go? Я нашел один пример here, но он все еще довольно маленький, и автор отмечает, что он новичок в Go, поэтому я не уверен, сколько из этого нужно доверять.
Спасибо!