go 建议:时间:添加查找最大或最小时间的功能, 提供的时间

xj3cbfub  于 6个月前  发布在  Go
关注(0)|答案(2)|浏览(44)

提案详情
在尝试将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.Maxslices.Min的cmp.Ordered要求。然而,这对于Unix时间小于0的时间不起作用。
我宁愿为time包添加MinMax函数。它们可以通过使用已经存在于该包中的BeforeAfter方法来工作。

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零值。

ssgvzors

ssgvzors1#

这个听起来很专业,在您的特定示例之外,这个操作通常使用多少次?

bwitn5fc

bwitn5fc2#

oldest := slices.MinFunc([]time.Time{now, someTime, someTime2}, time.Time.Compare)

https://go.dev/play/p/rVGx_3me6NQ

相关问题