我正在努力寻求社区的建议,以制定最佳实践。请以以下示例与我联系:
假设您的工作 间隔 是 开放时间的一半 ,即 开始时就知道的东西。
例如
HalfOpenInterval
对于这两种类型的实体:你与他们的集合,所以你通常slices的 时钟 和 时间 在你的代码。
slices
所以,现在问题来了: 你必须找到一个给定的时间间隔封闭 (func FindEnclosingHalfOpenInterval)用于 这两个 时钟和时间,于是你开始写代码…
func FindEnclosingHalfOpenInterval
好吧,我开始讨论这件事……我应该如何组织代码以便只编写一次通用函数。(func FindEnclosingHalfOpenInterval)。
所以我进入了这段代码:https : //play.golang.org/p/Cy7fFaFzYJR
但是我一直在想是否有更好的方法来定义切片集合的常见行为。
请读者,您将意识到我需要对每种切片类型进行“逐元素” 转换 (并且对于每种我定义的具体HalfOpenInterval类型,我都有一种切片类型)。因此,我想知道是否有任何方法可以让我引入新的类型而HalfOpenInterval无需进行一些调整,并且“自动”获得使用func FindEnclosingHalfOpenInterval?的能力。也许我基于Rich-oo- java的想法不是解决简单直接进入世界中问题的正确方法。我全都听到,有任何建议。
这里的关键问题是您需要将切片从一种类型转换为另一种类型。
正确的方法是创建一个新的切片并在其上循环以转换每个项目。如果您事先创建了数组,则可以更快地执行此操作:
func ToIntervalsFromClockIntervals(clockIntervals []ClockInterval) HalfOpenIntervals { intervals := make(HalfOpenIntervals, 0, len(clockIntervals)) for _, clockInterval := range clockIntervals { intervals = append(intervals, clockInterval) } return intervals }
除了这种组合之外,您还可以解决GetEnclosingInterval只编写一次函数的问题。我并不是说它更好:它还有其他优点和缺点。合适的方法取决于您在此处发布的内容之外还使用切片的方式。
GetEnclosingInterval
这是我的重构建议(并已修正):https : //play.golang.org/p/Ko43hJUMpyT(TehSṕhinX,您忘了使用而不是(或名称是)来创建 可变方法 )baseIntervals.add``pointer recievers``value recievers``non-pointer recievers
baseIntervals.add``pointer recievers``value recievers``non-pointer recievers
将HalfOpenIntervals不存在了。取而代之的是,您有两种不同的类型CLockIntervals,PeriodIntervals并且都具有GetEnclosingInterval通过通用基本结构实现的排序和功能。
HalfOpenIntervals
CLockIntervals
PeriodIntervals
为了方便起见,我为每个函数添加了Add一个New...函数。这就是缺点所在:由于CLockIntervals(和PeriodIntervals)不再是一个切片,而是一个结构,您将需要方便的功能来从外部处理内部切片。
Add
New...
-编辑-
我自己来自面向对象的背景,我知道不惜一切代价避免重复代码的动力。
现在,我已经全职编写了2年多的Go代码,我了解到,这并不总是go中最好的方法。这些天来,在不同类型的go中复制代码是我常做的事情。不过,不确定是否所有人都同意这一说法。