在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情景,应该怎么设计交互?感觉在游戏引擎中,可能会使用第一种
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
weapon 对 player 造成伤害应该是一个函数,并不需要保存 player