#4.2 golang Константы

Работа с константами в целом похожа на тот же процесс с переменными, но имеются и отличия.

В Go определяется при помощи ключевого слова const:

const pi = 3.141

или с явным укзанием типа:

	const pi float64 = 3.141

При этом, по крайней мере на момент написания данных строк, неиспользуемые константы в коде оставлять можно (в отличии от переменных)

Константы тоже можно объявлять в блокe const:

const (
   hello = "Привет"
   someConst     = 2.7
)

iota - автоинкремент констант

В Го есть iota — полезный автоинкремент для константы.
Довольно часто бывают случаи, когда надо объявить несколько констант, которые отличаются между собой на единицу.
Например, значения битов в какой-то битовой маске. Именно тут поможет автоинкремент:

const (
   zero  = iota
   _     // пустая переменная, пропуск iota
   three // = 2
)

Вы указываете iota на первом месте, а дальше нужно просто перечислить наименования констант, каждую с новой строки.

В данном случае константа three объявлена через iota. Если нужно пропустить какое-то значение, то используется символ подчеркивания.
В Go это означает пустую безымянную переменную, так называемую placeholder, которая говорит, что здесь должна быть переменная, но мы ее проигнорируем.

При этом iota может выступать не только простым автоинкрементом, но и участвовать в математических выражениях.
Например, в данном случае константа мегабайт определяется тоже через iota:

const (
   _         = iota             // пропускаем первое значне
   KB uint64 = 1 << (10 * iota) // 1024
   MB                           // 1048576
)

Нетепизированость констант без типа

Еще одна особенность Go — в том, что константа, у которой не указан тип, так и остается нетипизированной. Поэтому может в нужное место подставиться уже с нужным типом.

const (
   // нетипизированная константа
   year = 2017
   // типизированная константа
   yearTyped int = 2017
)

func main() {
   var month int32 = 13

   fmt.Println(month + year)

   // month + yearTyped (mismatched types int32 and int)
   // fmt.Println( month + yearTyped )
}

Выход за ограничения типа

За счет того, что константы могут быть нетипизированными, они могут хранить целочисленные значения, заметно превышающие 64 бита.

const c = 1 << 100 // очень большое число 2 в степени 100
const b = 1 << 100
// тем не менее можем применить в выражении
// (главное, чтобы умещался результат):
var a int = c - b + 1

fmt.Println(a)

Видео-материалы

  • golang Константы и работа с ними - Курс для начинающих: ВкВидео | Ютуб | Телеграм
vedro-compota's picture

three // = 3 - исправить

_____________
матфак вгу и остальная классика =)