gpt4 book ai didi

Golang 导入周期挑战

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:22 27 4
gpt4 key购买 nike

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

我的问题 - 我有两个包裹:

  • Event - Event 主要是“父项”,会多次调用锻炼包
  • Workout - 在一种情况下,我需要调用事件包,这会产生循环依赖,因为 Event 已经消耗了 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, "", "")
}

是否可以为该函数创建一个接口(interface)?我不完全明白我会怎么做。非常感谢。

//更新 - 尝试设置界面的代码

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

最佳答案

您发现可以使用界面来完成此操作。在事件包中,您需要为 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 没有编译时依赖性的接口(interface)包裹。你没有显示你是如何调用 workout 的包,但这可以作为方法调用的参数,也可以在锻炼包中构造结构时设置它。

关于Golang 导入周期挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53001783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com