Go中返回无效结构的惯用方法

Go中返回无效结构的惯用方法,go,idioms,Go,Idioms,我正在编写一个光线曲面碰撞函数,该函数需要返回small structs collision,其中包含一些有关碰撞的信息。目前我正在按值返回struct,因为我不需要调整或共享冲突的内容。但是,有时光线实际上不会碰撞,因此我的函数签名当前看起来像: func场景*场景GetFirstCollisionray*光线碰撞,布尔 其中布尔值在没有冲突时为false。但是,我不知道在没有碰撞的情况下,碰撞应该取什么值。如果它是一个指针,我只会返回nil,但它不是,那么我应该返回碰撞{}吗?如果更惯用的方

我正在编写一个光线曲面碰撞函数,该函数需要返回small structs collision,其中包含一些有关碰撞的信息。目前我正在按值返回struct,因为我不需要调整或共享冲突的内容。但是,有时光线实际上不会碰撞,因此我的函数签名当前看起来像:

func场景*场景GetFirstCollisionray*光线碰撞,布尔
其中布尔值在没有冲突时为false。但是,我不知道在没有碰撞的情况下,碰撞应该取什么值。如果它是一个指针,我只会返回nil,但它不是,那么我应该返回碰撞{}吗?如果更惯用的方法是返回*冲突,并在不存在时返回nil,我也愿意这样做,我想不出什么情况下我需要一个指向冲突的指针。

以我的拙见

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

如果将冲突作为指针返回对您的用例很重要,只需返回*collision,其中nil返回类型表示无冲突,如您所述


据我所知,光线跟踪的性能非常理想,因此您可能有真正的理由选择第一种方法。

以我的拙见

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

如果将冲突作为指针返回对您的用例很重要,只需返回*collision,其中nil返回类型表示无冲突,如您所述


据我所知,光线跟踪的性能非常理想,因此您可能有真正的理由选择第一个选项。

两者都可以。选择适合你的。如果指针在您的情况下没有意义,那么您不应该在没有有用值可返回的罕见情况下切换到指针。冲突{}是完全正确的。我不认为使用nil表示无冲突更为惯用,也不认为使用指针类型仅用于此目的更为惯用。然而,更惯用的是一个纯粹主观的、基于观点的问题,因此它脱离了主题。第三种选择是使冲突{},即零值冲突,表示无冲突。这似乎很容易做到初始化冲突内部可能至少有一些非零成员,即使它只是外部数组中的一个索引号,只要不要将数组的第零个成员用于任何事情,就可以了。那么你不需要单独的bool return,两者都可以。选择适合你的。如果指针在您的情况下没有意义,那么您不应该在没有有用值可返回的罕见情况下切换到指针。冲突{}是完全正确的。我不认为使用nil表示无冲突更为惯用,也不认为使用指针类型仅用于此目的更为惯用。然而,更惯用的是一个纯粹主观的、基于观点的问题,因此它脱离了主题。第三种选择是使冲突{},即零值冲突,表示无冲突。这似乎很容易做到初始化冲突内部可能至少有一些非零成员,即使它只是外部数组中的一个索引号,只要不要将数组的第零个成员用于任何事情,就可以了。那么你就不需要单独的bool返回了。第一个在语义上更清晰,所以我会把它颠倒过来。除非返回一个指针很重要,否则最好返回一个值和一个布尔值。@Adrian是的,我认为你的措辞更有意义-编辑。谢谢你的快速输入。我很少编程,这只是一个有趣的小数学项目,所以我从不确定正确的样式以及什么是/不是真的好,所以这是非常有用的。如果性能是一个问题,就像光线跟踪等图形化的事情一样,然后,当您考虑一个结构被复制了多少次时,切换到指针可能会提供相当多的性能提升。每当一个结构是一个参数、一个返回值、从数组或映射中检索时,或者您在一个列表中搜索时,整个结构都会被复制。如果是指针,则只复制地址,这会小得多/快得多。@CoreyOgburn是的,传递指针肯定会快得多。但我认为潜在的问题是堆分配的数量。我想,如果这是用于光线跟踪,那么该方法可能会被频繁调用。这需要大量的堆分配和大量的GC工作负载来使用指针。除非返回指针很重要,否则最好返回一个值和布尔值。@Adrian
是的,我认为你的措辞更有意义-编辑。谢谢你的快速输入。我很少编程,这只是一个有趣的小数学项目,所以我从不确定正确的样式以及什么是/不是真的好,所以这是非常有用的。如果性能是一个问题,就像光线跟踪等图形化的事情一样,然后,当您考虑一个结构被复制了多少次时,切换到指针可能会提供相当多的性能提升。每当一个结构是一个参数、一个返回值、从数组或映射中检索时,或者您在一个列表中搜索时,整个结构都会被复制。如果是指针,则只复制地址,这会小得多/快得多。@CoreyOgburn是的,传递指针肯定会快得多。但我认为潜在的问题是堆分配的数量。我想,如果这是用于光线跟踪,那么该方法可能会被频繁调用。使用指针需要大量的堆分配和GC工作负载。