提案详情
在尝试将Ruby代码移植到Go时,我遇到了一个问题,需要将类型为time.Time
的变量设置为三个不同时间中的最大值。这里的最大值是指最远的未来时间。在Ruby中,这涉及到将三个时间放入数组并在该数组上调用max方法。
my_time = [someTime, someTime2, DateTime.now].max
目前这在Go中不起作用,因为slices.Max
方法只适用于类型为cmp.Ordered
的切片,而time.Time
不是。
所有time.Time
都可以转换为int64 Unix表示,这将满足使用slices.Max
和slices.Min
的cmp.Ordered要求。然而,这对于Unix时间小于0的时间不起作用。
我宁愿为time
包添加Min
和Max
函数。它们可以通过使用已经存在于该包中的Before
和After
方法来工作。
func Max(x Time, y ...Time) Time {
maxTime := x
for _, val := range y {
if val.After(maxTime) {
maxTime = val
}
}
return maxTime
}
func Min(x Time, y ...Time) Time {
minTime := x
for _, val := range y {
if val.Before(minTime) {
minTime = val
}
}
return minTime
}
// Usage
thatTime := time.Max(someTime, someTime2, time.Now())
函数签名与内置的min和max函数相同,至少需要一个参数,这样我们就可以在没有传入其他参数的情况下返回该值。第一个参数也将用作我们寻找最小或最大时间的基础。这也防止了我们在Min函数中意外地返回time.Time零值。
2条答案
按热度按时间ssgvzors1#
这个听起来很专业,在您的特定示例之外,这个操作通常使用多少次?
bwitn5fc2#
https://go.dev/play/p/rVGx_3me6NQ