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",如您所述。
据我所知,光线追踪的性能非常好,因此您可能有真正的理由更喜欢第一个选项。
我正在编写一个需要 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",如您所述。
据我所知,光线追踪的性能非常好,因此您可能有真正的理由更喜欢第一个选项。