在Golang中,如何避免因对象交互导致的循环引用?

我平时用golang写代码,在写代码的过程中经常会为了避免循环引用而绞尽脑汁,主要是因为在对象的交互过程中一不小心就会循环引用,以下是我想到的一个场景:

//假设存在以下3个结构体
type Weapon struct {
}
type Player struct {
    weapon *Weapon
}
type World struct {
    Players []*Player
}

player间可以互相造成伤害,也就是说需要对象的指针来修改数据,所以我现在的问题是player该怎么存储正在交互的player的指针?
我有以下的几种想法:
1)Player中存储World的指针,这样Player可以与绝大多数公开的对象交互
2)Weapon中存储Player的指针,也比较符合通过武器对Player造成伤害的逻辑
3)Player中存储Player的指针,与上一个比较相似

如果只使用结构体,且这些结构体不放在同一级目录下,上面的逻辑除了3以外都会产生循环引用

在这种情景下,我的代码受到了很大的限制,我只能选择以下几种解决方法:
1)将所有结构体实现放在同一级目录下,或者将所有结构体放在model目录,在其他地方实现方法
2)提前就将player抽象出"伤害者", "被伤害者"的接口,将接口放在同一级目录下

总的来说,我有以下几个问题:
1)我该遵循一个什么样的代码规范,来规避循环引用?
2)在使用其他语言时,是否也需要尽可能的避免循环引用?
3)上述的player情景,应该怎么设计交互?感觉在游戏引擎中,可能会使用第一种

阅读 4.5k
1 个回答

weapon 对 player 造成伤害应该是一个函数,并不需要保存 player

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题