小编典典

有没有建议的方法来定义切片集合的常见行为?

go

我正在努力寻求社区的建议,以制定最佳实践。请以以下示例与我联系:

假设您的工作 间隔开放时间的一半 ,即 开始时就知道的东西。

例如

  • 可以HalfOpenInterval限制一天。示例:您说“从下午1:00开始”(直到一天结束)。我们称之为 ClockInterval
  • 可以HalfOpenInterval局限于宇宙的存在。示例:您说“从1810年7月9日起,我们宣布独立。”(假设直到宇宙末日。)我们称之为 时期

对于这两种类型的实体:你与他们的集合,所以你通常slices时钟时间 在你的代码。

所以,现在问题来了: 你必须找到一个给定的时间间隔封闭func FindEnclosingHalfOpenInterval)用于 这两个
时钟和时间,于是你开始写代码…

好吧,我开始讨论这件事……我应该如何组织代码以便只编写一次通用函数。(func FindEnclosingHalfOpenInterval)。

所以我进入了这段代码:https :
//play.golang.org/p/Cy7fFaFzYJR

但是我一直在想是否有更好的方法来定义切片集合的常见行为。

请读者,您将意识到我需要对每种切片类型进行“逐元素” 转换
(并且对于每种我定义的具体HalfOpenInterval类型,我都有一种切片类型)。因此,我想知道是否有任何方法可以让我引入新的类型而HalfOpenInterval无需进行一些调整,并且“自动”获得使用func FindEnclosingHalfOpenInterval?的能力。也许我基于Rich-oo-
java的想法不是解决简单直接进入世界中问题的正确方法。我全都听到,有任何建议。


阅读 377

收藏
2020-07-02

共1个答案

小编典典

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

转换切片

正确的方法是创建一个新的切片并在其上循环以转换每个项目。如果您事先创建了数组,则可以更快地执行此操作:

func ToIntervalsFromClockIntervals(clockIntervals []ClockInterval) HalfOpenIntervals {
    intervals := make(HalfOpenIntervals, 0, len(clockIntervals))
    for _, clockInterval := range clockIntervals {
        intervals = append(intervals, clockInterval)
    }
    return intervals
}

组成

除了这种组合之外,您还可以解决GetEnclosingInterval只编写一次函数的问题。我并不是说它更好:它还有其他优点和缺点。合适的方法取决于您在此处发布的内容之外还使用切片的方式。

这是我的重构建议(并已修正):https :
//play.golang.org/p/Ko43hJUMpyT(TehSṕhinX,您忘了使用而不是(或名称是)来创建
可变方法baseIntervals.add``pointer recievers``value recievers``non-pointer recievers

HalfOpenIntervals不存在了。取而代之的是,您有两种不同的类型CLockIntervalsPeriodIntervals并且都具有GetEnclosingInterval通过通用基本结构实现的排序和功能。

为了方便起见,我为每个函数添加了Add一个New...函数。这就是缺点所在:由于CLockIntervals(和PeriodIntervals)不再是一个切片,而是一个结构,您将需要方便的功能来从外部处理内部切片。

-编辑-

过度概括

我自己来自面向对象的背景,我知道不惜一切代价避免重复代码的动力。

现在,我已经全职编写了2年多的Go代码,我了解到,这并不总是go中最好的方法。这些天来,在不同类型的go中复制代码是我常做的事情。不过,不确定是否所有人都同意这一说法。

2020-07-02