package cache type Ranger interface { GetPosition() int64 GetLength() int64 } // 查找第一个包含指定位置的段索引。如果所有段都不包含指定位置,那么有以下三种情况: // // 1. pos小于第一个段的位置,返回-1 // // 2. pos大于等于最后一个段的结束位置,返回BuzyCount() - 1 // // 3. pos在段之间的空洞内,那么会返回小于pos的最后一个段 // // 注:2、3情况返回的结果是相同的 func FirstContains[T Ranger](arr []T, pos int64) int { low, high := 0, len(arr)-1 for low <= high { mid := (low + high) / 2 if arr[mid].GetPosition() > pos { high = mid - 1 } else if arr[mid].GetPosition() < pos { if mid == len(arr)-1 { return mid } low = mid } else { return mid } } return high }