tgoop.com/go_interview_lib/536
Create:
Last Update:
Last Update:
💬 Перечислите кейсы применения iota в Go.
🔸 iota
и enums
Мы часто определяем константы в Go для создания списка возможных значений, которые что-то может принимать (это иногда называют enum).
const (
Planet = 0
Star = 1
Comet = 2
Galaxy = 3
// и так далее
)
Конкретные числа 0, 1, 2... здесь не имеют значения. Это просто произвольные значения, с которыми можно сравнивать объекты:
if object.Kind == Planet {
// это планета!
}
🔸 Использование
iota
с const
Однако поддерживать длинный список таких чисел вручную сложно. Вот где приходит на помощь
iota
. Это своего рода магическое, постоянно увеличивающееся значение, которое мы можем использовать для присвоения произвольных чисел константам:const (
Planet = iota // 0
Star // 1
Comet // 2
Galaxy // 3
// ...
)
Мы фактически присваиваем
iota
каждой константе в списке, но Go позволяет опустить запись = iota
после первой константы. 🔸 Начало
iota
с 1Также мы можем использовать
iota
в более сложных выражениях. Например, если мы хотим, чтобы значения начинались с 1, а не с 0:const (
January = iota + 1
February
March
// ...
)
Здесь значение для
January
будет 1, для February
— 2 и так далее.🔸
iota
игнорирует комментарииКстати, можно добавлять комментарии или пустые строки в блок констант, и это не повлияет на значения
iota
:const (
Electron = iota // 0
Neutron // 1
Proton // 2
Photon // 3
Gluon // 4
)
🔸
iota
, флаги и битовые маскиЕщё одно распространённое применение
iota
— создание значений для битовых масок. Битовая маска — это способ сравнить число с бинарным значением, чтобы проверить, установлен ли конкретный бит в 1 или 0. Когда используются конкретные битовые значения, их иногда называют флагами, а число, содержащее их, — битовым полем.Например:
const (
Bit0 = 1 << iota // 1
Bit1 // 2
Bit2 // 4
// ...
)
Оператор
<<
сдвигает биты числа влево на указанное количество позиций. Так как iota
увеличивается на единицу для каждой последующей константы, коэффициент сдвига тоже увеличивается на один, поэтому значения, присвоенные константам, продолжают удваиваться.Теперь можно выполнить побитовое сравнение этих масок с интересующим нас числом:
v := 0b00000010
if v&Bit1 != 0 {
fmt.Println("Looks like bit 1 is set!")
}
// Looks like bit 1 is set!
BY Библиотека Go для собеса | вопросы с собеседований
Share with your friend now:
tgoop.com/go_interview_lib/536