Go常用Tricks

这段代码可以优化,因为它没有考虑闰年的2月29日和不同月份的实际天数(有些月是31天)。以下是优化后的代码:

1
2
3
// 获取当月的最后一天
lastDay := time.Date(now.Year(), now.Month()+1, 0, 0, 0, 0, 0, now.Location())
targetDay = lastDay

这个优化使用了一个常见的技巧:获取下个月的第0天,Go语言会自动将其解释为当前月份的最后一天。这样的写法有以下优点:

  1. 自动处理闰年的2月(28天或29天)
  2. 自动处理不同月份的天数(30天或31天)
  3. 代码更简洁,不需要条件判断
  4. 更符合实际需求,如果目的是月底检查,应该是每月的最后一天

如果你确实只需要固定的日期(2月28日和其他月份的30日),那么原代码就没问题,但通常监控月底状态更常见的是使用每月的实际最后一天。


sort.Slice(ps, func(i, j int) bool {
return ps[i].Count > ps[j].Count
}) 能否简化?

这是排序代码的一个标准写法,使用 sort.Slice 根据 Count 字段进行降序排序。如果你想简化,可以考虑以下替代方法:

1
2
3
sort.SliceStable(ps, func(i, j int) bool {
return ps[i].Count > ps[j].Count
})

或者,如果你频繁需要这种排序,可以为你的切片类型定义一个排序方法:

1
2
3
4
5
6
7
8
type Products []Product  // 假设 ps 是 Product 的切片

func (p Products) Len() int { return len(p) }
func (p Products) Less(i, j int) bool { return p[i].Count > p[j].Count }
func (p Products) Swap(i, j int) { p[i], p[j] = p[j], p[i] }

// 使用时
sort.Sort(Products(ps))

但老实说,原代码已经相当简洁,特别是如果这只是一次性排序。使用 sort.Slice 是 Go 语言中最直接和可读性最好的方法之一。

文章目录