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