У меня проблема с циклической зависимостью (цикл импорта не разрешен) в моем коде go, и я не уверен, что это лучший способ ее устранения.Я думаю, что мое непонимание интерфейсов golang может повлиять на мою способность видеть путь вперед.
Моя проблема - у меня есть два пакета:
- Событие - Событие в основном является «родительским» и будет делать много вызовов в пакет тренировки
- Тренировка - В одном случае мне нужно вызвать пакет события, и это создает циклическую зависимость, потому что событие ужепотребляет Workout
Каков наилучший способ, позволяющий Workout вызывать функцию (а не метод объекта) в домене событий?
Ниже приведен упрощенный код, помогающий обеспечить некоторый контекст
//workout package
//This is a private function on the workout package that is
//attempting to call a public function on the Event Package
func findWorkoutAssociatedToActivityTcx(txcObject *DataTcx) *EventWorkout{
return event.GetEventByDate(txcObject.ActivityDate, "", "")
}
Можно ли создать интерфейс для этой функции?Я не до конца понимаю, как бы я это сделал.Большое спасибо.
// ОБНОВЛЕНИЯ - Код при попытке установить интерфейс
//WorkoutPackage
//workout package
//This is a private function on the workout package that is
//attempting to call a public function on the Event Package
func findWorkoutAssociatedToActivityTcx(txcObject *DataTcx, userID, transactionID string) *Workout {
//return event.GetEventByDate(txcObject.ActivityDate, "", "")
MyEventFinder.GetEventByDate(txcObject.ActivityDate, userID, transactionID)
return nil
}
var MyEventFinder EventFinder
type EventFinder interface {
GetEventByDate(time.Time, string, string) (*sharedstructs.ListOfEvents, error)
}
// Пакет событий
type eventProvider struct{}
func (e eventProvider) GetEventByDate(date time.Time, userID, transactionID string) (*sharedstructs.ListOfEvents, error) {
redFalconLogger.LogDebug("event.GetEventByDate: ", transactionID)
if date.IsZero() || userID == "" {
return nil, sharedstructs.InvalidData{Msg: "Invalid date or userID"}
}
//Create the query params
queryParamArray, queryParamCreationError := createQueryParamForQueryByDate(&date, &userID)
if queryParamCreationError != nil {
return nil, queryParamCreationError
}
//perform the query - pass empty orderBy because I don't care
queryResults, queryError := queryForEvent(*queryParamArray, "")
if queryError != nil {
switch queryError.(type) {
case firestorehelper.UnqueryableCollection:
return nil, sharedstructs.Forbidden{Msg: "operation is forbidden, probably due to malformed query"}
default:
return nil, sharedstructs.InternalServerError{Msg: "something went wrong in the query"}
}
}
return queryResults, nil
}