【发布时间】:2019-03-30 19:18:21
【问题描述】:
我的 go 代码中存在循环依赖问题(不允许导入循环),并且不确定解决它的最佳方法。我认为我对 golang 接口缺乏了解可能会影响我看到前进方向的能力。
我的问题 - 我有两个包:
- 事件 - 事件主要是一个“父级”,并且会在锻炼包中进行多次调用
- Workout - 在一种情况下,我需要调用 Event 包,这会产生循环依赖,因为 Event 已经消耗了 Workout
允许 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, "", "")
}
是否可以在该函数中创建一个接口?我不完全明白我会怎么做。非常感谢。
//更新 - 尝试设置界面的代码
//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
}
【问题讨论】:
-
返回类型为*EventWorkout。如果它们紧密耦合,您不会考虑合并这些包吗?否则我会创建另一个包来定义将由
event包中的结构实现的接口,并用它替换当前的返回类型。 -
@Berkant 你不需要第三个包来定义接口,因为接口只需要被消费包引用,而不是被实现它的包引用;此外,相同的接口可以在多个包中定义并且是等效的。
标签: go dependencies package