Go语言中如何从数组中间索引开始遍历,之后从索引0继续遍历?
如何实现从数组中间位置开始遍历,再从索引0继续遍历?
我需要实现从数组中间指定位置开始遍历,遍历到数组末尾后,再从索引0开始继续遍历的逻辑,目前的解决方案是重复了两段几乎完全一样的代码块:
for _, daysInMonth := range daysInMonths[a.Month()-1:] { daysDiff -= float64(daysInMonth) if daysDiff < 0 { daysDiff += float64(daysInMonth) break } monthsDiff += 1 } for _, daysInMonth := range daysInMonths { daysDiff -= float64(daysInMonth) if daysDiff < 0 { daysDiff += float64(daysInMonth) break } monthsDiff += 1 }
优化方案:消除重复代码
可以通过两种方式解决代码重复问题:
方案1:提取重复逻辑为函数
将两段循环内的相同逻辑封装成独立函数,通过调用函数来复用逻辑:
func processMonthSlice(months []int, daysDiff *float64, monthsDiff *int) { for _, days := range months { *daysDiff -= float64(days) if *daysDiff < 0 { *daysDiff += float64(days) return } *monthsDiff += 1 } } // 调用函数完成遍历 processMonthSlice(daysInMonths[a.Month()-1:], &daysDiff, &monthsDiff) processMonthSlice(daysInMonths, &daysDiff, &monthsDiff)
方案2:构造拼接切片实现单次遍历
将需要遍历的两段切片拼接成一个新切片,只需一次循环即可完成从中间到末尾、再从开头的遍历:
// 拼接切片:从指定中间位置到末尾的部分 + 整个原切片 traversalSlice := append(daysInMonths[a.Month()-1:], daysInMonths...) for _, days := range traversalSlice { daysDiff -= float64(days) if daysDiff < 0 { daysDiff += float64(days) break } monthsDiff += 1 }
两种方案都能实现需求,方案1更适合逻辑复杂、需要单独复用的场景;方案2代码更简洁,适合简单遍历的场景。
内容的提问来源于stack exchange,提问作者Jason Rich Darmawan
相关产品推荐
相关产品推荐

