Return Go 中无效结构的惯用方法

Idiomatic Way to Return an Invalid Struct in Go

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

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

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

依我愚见...

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

  • 如果return将碰撞作为指针对您的用例很重要,只需return一个*Collision,其中 nil return 类型表示 "no collision",如您所述。

据我所知,光线追踪的性能非常好,因此您可能有真正的理由更喜欢第一个选项。