Go 是否有推荐的方法来定义切片收集的常见行为?

Go 是否有推荐的方法来定义切片收集的常见行为?,go,slice,Go,Slice,我正试图从社区获得建议,以便制定最佳实践。 请耐心听我说,举个例子: 假设您使用的是半开区间,也就是说,您知道它何时开始 比如说 可以将HalfOpenInterval限制为一天。例如:你说“从下午1点开始”(直到一天结束)。我们称之为时钟间隔 可以有half-openinterval限制于宇宙的存在。例如:你说“从1810年7月9日起,我们宣布独立”(假设直到宇宙的终结)。让我们称之为时段 对于这两种实体类型:您使用它们的集合,因此您的代码中通常有片段的时钟和周期 现在问题来了:您必须找到

我正试图从社区获得建议,以便制定最佳实践。 请耐心听我说,举个例子:

假设您使用的是半开区间,也就是说,您知道它何时开始

比如说

  • 可以将
    HalfOpenInterval
    限制为一天。例如:你说“从下午1点开始”(直到一天结束)。我们称之为时钟间隔
  • 可以有
    half-openinterval
    限制于宇宙的存在。例如:你说“从1810年7月9日起,我们宣布独立”(假设直到宇宙的终结)。让我们称之为时段
对于这两种实体类型:您使用它们的集合,因此您的代码中通常有
片段
时钟周期

现在问题来了:您必须找到给定时间(
func FindEnclosingHalfOpenInterval
)内时钟和句点的封闭间隔,然后开始编写代码

好吧,我介入这件事。。。我应该如何组织代码,以便只编写一次公共func。(
func FindEnclosingHalfOpenInterval

所以我进入了这段代码:

但我一直想知道是否有更好的方法来定义切片收集的常见行为


读者请注意,我需要对每种类型的切片进行“逐元素”转换(我定义的每种类型的混凝土半开放区间都有一种切片)。因此,我想知道是否有任何方法可以让我引入新类型的
HalfOpenInterval
,而无需进行一些调整,“自动”获得使用
func FindEnclosingHalfOpenInterval
的能力?。也许我丰富的基于java的oo思想并不是在简单的直截了当的世界中面对问题的正确方式。我完全同意任何建议。

我想这可能太复杂了。将FindEnclosingHalfOpenInterval定义为一个独立函数,然后对于需要使用HalfOpenInterval结构的函数,使其接受一个具有封闭的AlfOpenInterval方法的接口,该方法通常只调用FindEnclosingHalfOpenInterval。这样,您就可以在不更改签名的情况下进行任何类型的边缘案例数据封装


这就是一切。FindEnclosingHalfOpenInterval已被共享,因为它不是任何结构的显式部分。

这里的关键问题是需要将切片从一种类型转换为另一种类型

转换切片 正确的方法是创建一个新的切片并在其上循环转换每个项目。如果事先创建阵列,则可以快速(er)执行此操作:

func ToIntervalsFromClockIntervals(clockIntervals []ClockInterval) HalfOpenIntervals {
    intervals := make(HalfOpenIntervals, 0, len(clockIntervals))
    for _, clockInterval := range clockIntervals {
        intervals = append(intervals, clockInterval)
    }
    return intervals
}
作文 除此之外,还有另一种方法可以解决只需编写一次
getEnclosuringInterval
函数的问题。我并不是说它更好:它还有其他优点和缺点。什么更合适取决于除了你在这里发布的内容之外,你还如何使用这些切片

这里是我的重构建议(已修复):(TehSṕhinX您忘了使用可变方法
基间隔。请使用
指针接收器
而不是
值接收器
(或非指针接收器的名称)添加

half-openinterval
不再存在。相反,您有两种不同类型的
时钟间隔
周期间隔
,它们都有通过公共基本结构实现的排序和
GetEnclosuringInterval
函数

为了方便起见,我为它们分别添加了一个
Add
函数和一个
New…
函数。这就是缺点所在:由于
时钟间隔
(和
周期间隔
)不再是一个切片,而是一个结构,因此您需要方便的函数从外部处理内部切片

--编辑--

过度概括 我本人来自面向对象的背景,知道不惜一切代价避免重复代码的驱动力


在全职的基础上写了两年多的围棋代码,我发现这并不总是围棋中最好的方法。在go中复制不同类型的代码是我这些天经常做的事情。不过,不确定是否所有人都同意这一说法。

@Adrian他正在使用一个界面。感谢Josiah的回答,感谢他抽出时间阅读。我不确定我是否理解你的想法,你可以编写你正在谈论的底层代码,这样我就没有理由不理解了!这里有一个又快又脏的例子:非常感谢你ṕhinX!!,这确实是一种摆脱这种情况的方法,而且解释得很好。让我们再等一等,等待另一个关于这件事的答案,最终,我会把这个答案标记为正确的。我想,在每种编程语言中,定义事物集合的常见行为都是一个复杂的主题。Nit:Go没有强制转换,只有类型转换。@Peter:谢谢你的提示。我在回答中更正了它。我肯定在另一个帖子中回答了某人Peter,但它似乎消失了。。因此,我认为这是正确的答案,这证明了(对我来说)在如何解决切片上常见行为的问题上增加了有价值的知识。