首页 > 解决方案 > 在 Go 中返回无效结构的惯用方式

问题描述

我正在编写一个需要返回小结构的射线表面碰撞函数(Collision包含一些关于碰撞的信息)。目前我正在按值返回结构,因为我不需要调整或共享collision. 然而,有时光线实际上不会发生碰撞,所以我的函数签名目前看起来像:

func (scene *Scene) GetFirstCollision(ray *Ray) (Collision, bool)

没有碰撞时布尔值为假。但是,我不知道Collision没有碰撞时应该取什么值。如果它是一个指针,我只会 return nil,但它不是,所以我应该 returnCollision{}吗?如果整体更惯用的方式只是返回 a*Collisionnil在它不存在时返回,我也对此持开放态度,我只是想不出我需要指向碰撞的指针的情况。

标签: goidioms

解决方案


在我的愚见...

  • 除非返回指针对您的用例很重要,否则请继续使用返回类型并在没有冲突时(Collision, bool)简单地执行。return Collision{}, false

  • 如果将冲突作为指针返回对您的用例重要,只需返回 a *Collision,其中nil返回类型表示“无冲突”,如您所描述的。

据我所知,希望光线追踪具有相当高的性能,因此您可能有真正的理由更喜欢第一个选项。


推荐阅读