Golang进口周期挑战

时间:2018-10-26 05:07:51

标签: go dependencies package

我在go代码中遇到了循环依赖关系的问题(不允许导入循环),并且不确定如何解决该问题的最佳方法。我认为我对golang接口的缺乏了解可能会影响我了解前进方向的能力。

我的问题-我有两个软件包:

  • 事件-事件主要是一个“父项”,将向健身包发出很多呼叫
  • 锻炼-在一种情况下,我需要调用事件包,由于事件已经消耗了锻炼,因此创建了周期性依赖关系

允许Workout在Event域中调用函数(而不是对象上的方法)的最佳方法是什么?

下面是我的简化代码,可帮助提供一些上下文

//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, "", "")
}

是否可以在该函数中创建接口?我不完全了解我该怎么做。非常感谢。

// UPDATES-尝试设置接口的代码

//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
    }

1 个答案:

答案 0 :(得分:1)

您可以通过界面执行此操作。在事件包中,您需要为GetEventByDate提供一个接收者结构:

type eventProvider struct {}
func (e eventProvider) GetEventByDate(t time.Time, a, b string) *workout.EventWorkout{...}

然后在锻炼包中:

type EventFinder interface {
    GetEventByDate(time.Time, string, string) *EventWorkout
}

然后,您可以将eventProvider实例传递到锻炼包中,并仅通过EventFinder接口使用该实例,该接口对event包没有编译时间依赖性。您没有显示如何调用workout程序包,但这可以作为方法调用的参数,也可以在锻炼程序包中构造结构时进行设置。