В Go (или «Golang») тип данных rune представляет собой кодовую точку Unicode. Под капотом rune является псевдонимом для int32, так что каждый rune фактически является числом, представляющим соответствующий символ Unicode.
Функция getNumberByRune принимает символ Unicode (руну) в качестве входного параметра и преобразует его в целое число. В данной строке:
return int(digit — ‘0’)
происходит следующее:
1. digit — это руна, которая представляет собой символ-цифру (например, ‘0’, ‘1’, ‘2’ и т.д.).
2. '0' — это руна, представляющая символ ‘0’, который в Unicode имеет кодовую точку U+0030 (или 48 в десятичной системе).
3. Когда мы вычитаем '0' (код 48) из digit, мы фактически вычитаем числовое значение кодовой точки символа ‘0’ из числового значения кодовой точки символа, представленного digit.
4. Так как в Unicode цифры от 0 до 9 идут подряд, вычитание значения ‘0’ из значения другой цифры даст нам их порядковый номер — то есть, если digit — это руна ‘0’, результат будет 0; если digit — это руна ‘1’, результат будет 1, и так далее до ‘9’, который даст результат 9.
Таким образом, этот код корректно преобразует символ-цифру, представленный руной, в соответствующее ему целое число. Приведение к типу int в int(digit - '0') обеспечивает, что результат будет представлен типом int, который является наиболее распространенным целочисленным типом в Go и обычно используется для целых чисел, если не требуется специфический размер или знаковый диапазон.