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

发布于 2022-09-12 23:18:23 字数 773 浏览 13 评论 0

我平时用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哆啦不做梦 2022-09-19 23:18:23

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文