Если я правильно понимаю, в мире идей вы хотели бы иметь возможность поиска "сотрудников для данного проекта" , а также "проектов для данного сотрудника" ?
Не зная контекста, в котором вы будете использовать этот код;например, больше операций записи, чем чтения, больше операций чтения, чем записи, каковы требования к сложности пространства и времени.
Если вы стремитесь к O (1) поиску проектов для сотрудника и O (1) поиску сотрудниковдля проекта я бы предложил создать собственную структуру данных, чтобы облегчить это.Это самый маленький интерфейс, который будет работать:
type ProjectEmployees interface {
RegisterProjectEmployee(p *Project, e *Employee)
GetEmployees(p *Project) []*Employees
GetProjects(e *Employee) []*Project
}
Я не перечислил полную реализацию ниже, так как это было бы тривиально, но вы бы реализовали этот интерфейс со структурой, которая хранит 2 карты.,
Компромисс в том, что у вас больше затраты на запись / обновление и дублирование данных, преимущество - O (1) поиск в обоих направлениях Project <--> Employee
.
type projecEmployeesMap struct {
pe map[*Project][]*Employee
ep map[*Employee][]*Project
}
func (p *projectEmployeesMap) RegisterProjectEmployee(p *Project, e *Employee) {
p.pe[p] = append(p.pe[p], e) // store the mapping project -> employees
p.ep[e] = append(p.ep[e], p) // store the mapping employees --> project
}
Методы getдолжно быть легко реализовано с помощью простого поиска по карте