Константы и переменные
Все литералы называются безымянными константами (или литеральными константами), за исключением false и true, которые являются двумя предварительно объявленными (встроенными) именованными константами. Пользовательские именованные объявления констант мы рассмотрим далее.
Нетипизированные и типизированные значения
В Go некоторые значения не типизированы. Нетипизированное значение означает, что тип значения еще не подтвержден. Наоборот, определяется тип типизированного значения.
Для большинства нетипизированных значений каждое из них имеет один тип по умолчанию. Предварительно объявленное значение nil — это единственное нетипизированное значение, не имеющее типа по умолчанию.
Все литеральные константы (безымянные константы) являются нетипизированными значениями. В Go большинство не типизированных значений — это литеральные константы и именованные константы. Другие нетипизированные значения включают только что упомянутые nil и некоторые логические результаты, возвращаемые некоторыми операциями.
Тип литеральной константы по умолчанию определяется ее буквальной формой.
- Тип строкового литерала по умолчанию — string.
- Тип логического литерала по умолчанию — bool.
- Тип целочисленного литерала по умолчанию — int.
- Тип литерала рун по умолчанию — rune (также известный как int32).
- Тип литерала с плавающей запятой по умолчанию — float64.
- Если литерал содержит мнимую часть, то его тип по умолчанию — complex128.
Явные преобразования нетипизированных констант
Как и многие другие языки, Go также поддерживает преобразование значений. Мы можем использовать форму T(v) для преобразования значения v в тип, обозначенный T (или, проще говоря, тип T). Если преобразование T(v) допустимо, компиляторы Go рассматривают T(v) его как типизированное значение типа T. Конечно, для определенного типа T, чтобы сделать преобразование T(v) законным, значение v не может быть произвольным.
Следующие упомянутые правила применяются как к литеральным константам, так и к нетипизированным именованным константам.
Для нетипизированного постоянного значения v допустимо два сценария T(v).
- v (или литерал, обозначаемый v) может быть представлен как значение базового типа T. Результатом является типизированная константа типа T.
- Типом по умолчанию v является целочисленный тип ( int или rune) и T строковый тип. Результатом T(v) является строка типа, T содержащая представление целого числа UTF-8 в виде кодовой точки Unicode. Целочисленные значения вне диапазона допустимых кодовых точек Unicode приводят к строкам, представленным "\uFFFD" (иначе, "\xef\xbf\xbd"). 0xFFFD является кодовой точкой для символа замены Unicode. Строка результата преобразования из целого числа всегда содержит только одну руну. Обрати внимание, что более поздняя версия Go может разрешать преобразование только рунических или байтовых целых чисел в строки. Начиная с Go Toolchain 1.15, go vet команда предупреждает о преобразованиях не рунических и байтовых целых чисел в строки.
Подробнее узнать о преобразовании рунических или байтовых целых чисел ты можешь в статье Github.
На самом деле второй сценарий v не обязательно должен быть константой. Если v является константой, то результат преобразования также является константой, в противном случае результат не является константой.
Например, все следующие преобразования допустимы.
И все следующие преобразования незаконны.
Из приведенных выше примеров мы знаем, что нетипизированная константа (например , -1e1000 и 0x10000000000000000) может даже не быть представлена как значение своего типа по умолчанию.
Обрати внимание, что иногда форма явного преобразования (T)(v) должна быть написана так, чтобы избежать двусмысленности. Такие ситуации часто случаются, если T не является идентификатором.