在Golang中,如何避免因对象交互导致的循环引用?
  • H5W3
  • 2021-06-16 22:28:02

我平时用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情景,应该怎么设计交互?感觉在游戏引擎中,可能会使用第一种

回答:

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

以上是 在Golang中,如何避免因对象交互导致的循环引用? 的全部内容, 来源链接: www.h5w3.com/175530.html