А функции типа данных у меня занимают мин, uint16
макс параметров и в некоторой точке перебирает числовой диапазон. Однако если max2^16-1 (и это допустимый прецедент), то переполнение прерывает логику цикла. Ниже приведен пример кода, демонстрирующий проблему с uint8
:итерационных границ такой же, как
package main
import "fmt"
func iter(min, max uint8) {
for i := min; i <= max; i++ {
fmt.Printf("%d, ", i)
}
}
func main() {
iter(0, 255)
}
Как вы можете видеть, программа никогда не заканчивается. Аналогичный вопрос задавали в another question, но решение точно показывает ту же проблему, что и у меня.
Мое мышление сейчас является преобразование переменной цикла в uint32
, похожее на это:
package main
import "fmt"
func iter(min, max uint8) {
for i := uint16(min); i <= uint16(max); i++ {
fmt.Printf("%d, ", i)
}
}
func main() {
iter(0, 255)
}
Однако, это, кажется, неуклюжее решение, которое не будет работать на uint64
или что-то самое большое uintN
тип. Чувствуется, что я пропускаю что-то очень основное. Руководство?
Я знаю Brad Fitz's Iter solution, но, кажется, добавляет ненужные накладные расходы. Это правда?
У меня есть Hacky решение для вас, а не переборе до 'max' включительно, итерацию до' max' эксклюзив. Таким образом, переполнение никогда не достигается. –
Полагаю, это стиль, который вы предлагаете? https://gist.githubusercontent.com/didenko/ed5144f6349656c683dc/raw/3a4b2d1c565819f54604a97409e6b6b0d0fe50b8/max_special.go –
@ VladDidenko: Какой результат вы получаете для 'iter (42, 7)'? https://gist.githubusercontent.com/didenko/ed5144f6349656c683dc/raw/3a4b2d1c565819f54604a97409e6b6b0d0fe50b8/max_special.go – peterSO