go - 在 Go 中返回无效结构的惯用方式
问题描述
我正在编写一个需要返回小结构的射线表面碰撞函数(Collision
包含一些关于碰撞的信息)。目前我正在按值返回结构,因为我不需要调整或共享collision
. 然而,有时光线实际上不会发生碰撞,所以我的函数签名目前看起来像:
func (scene *Scene) GetFirstCollision(ray *Ray) (Collision, bool)
没有碰撞时布尔值为假。但是,我不知道Collision
没有碰撞时应该取什么值。如果它是一个指针,我只会 return nil
,但它不是,所以我应该 returnCollision{}
吗?如果整体更惯用的方式只是返回 a*Collision
并nil
在它不存在时返回,我也对此持开放态度,我只是想不出我需要指向碰撞的指针的情况。
解决方案
在我的愚见...
除非返回指针对您的用例很重要,否则请继续使用返回类型并在没有冲突时
(Collision, bool)
简单地执行。return Collision{}, false
如果将冲突作为指针返回对您的用例很重要,只需返回 a
*Collision
,其中nil
返回类型表示“无冲突”,如您所描述的。
据我所知,希望光线追踪具有相当高的性能,因此您可能有真正的理由更喜欢第一个选项。