Часть серии Go for Java Programmers
Прежде чем мы перейдем к пользовательским типам и версии объектной ориентации Go, давайте рассмотрим простые типы, которые выходят из коробки. Полную информацию можно найти в (на удивление читаемой) спецификации языка , но вот некоторые основные моменты, которые важны с точки зрения программиста на Java.
Булевы
Булевы переменные объявляются с типом bool, и их значение должно быть одной из двух констант, true или false.
1
2
3
4
|
... var isActive bool fmt.Printf( "The value of 'isActive' is %t\n" , isActive) ... |
Результатом этой программы будет:
1
|
The value of 'isActive' is false |
Обратите внимание, что bool Go, как и булевский примитив Java, инициализируется значением false, если вы не указали никакого значения. Однако, в отличие от Java, в Go нет отдельных понятий «примитивный» логический и «объектный» логический.
В Go действительно есть понятие «тип» против «указатель на этот тип», и нам придется беспокоиться о нулевых указателях, когда мы туда доберемся (пара статей в будущем!). Пока что будьте спокойны, когда вы не имеете дело с указателями, типы Go работают так же, как примитивы Java. Go инициализирует их с нормальными значениями по умолчанию, и на самом деле компилятор не позволит вам инициализировать его с помощью nil (то есть версия Go с нулевым значением).
Персонажи и Струны
В Java тип String — это класс … нет понятия string как примитивного типа. Еще раз, однако, линия разграничения в Go лежит между «типами» и «указателями на типы». Когда вы инициализируете не указательный тип напрямую, это похоже на работу с примитивом Java.
Так что больше никаких проблем с нулевой проверкой со строками! Если вы инициализируете строку Go без присвоения значения, то по умолчанию ей присваивается значение пустой строки («»), а не ноль.
Поддержка юникода
Говоря о присвоении значений, строки Go довольно удобны для Unicode. Формат файла для исходного кода Go — UTF-8 , поэтому любые строковые литералы, объявленные в вашем коде, также хранятся как UTF-8. Строго говоря, строка Go представляет собой серию байтов, а не массив символов, поэтому существуют крайние случаи, когда строковая переменная может содержать двоичные данные (более подробно см. Эту интересную статью в официальном блоге Go). Однако на практике строки Go почти всегда имеют UTF-8.
1
2
3
4
|
... fmt.Printf( "Escaped represention:\t %+q\n" , "世界" ) fmt.Printf( "UTF-8 representation:\t %s\n" , "\u4e16\u754c" ) ... |
Результатом этой программы будет:
1
2
|
Escaped represention: "\u4e16\u754c" UTF-8 representation: 世界 |
Символы и подстроки
Для хранения отдельных символов в Go есть тип данных rune. Тип руны является псевдонимом для int32 (рассматривается в следующем разделе ниже) и предназначен для хранения одного символа Unicode (или «кодовой точки»). Вы можете извлечь из строки одиночные руны или подстроку, используя синтаксис массива с нулевым индексом. Встроенная функция Go len (s) дает вам длину строки, чтобы помочь вам избежать Go-эквивалента ArrayIndexOutOfBoundsException:
01
02
03
04
05
06
07
08
09
10
11
|
... testString := "This is just a test string" fmt.Printf( "This string has %d characters\n" , len(testString)) fmt.Printf( "The 3rd character is: %c\n" , testString[ 2 ]) lastRuneIndex := len(testString) - 1 fmt.Printf( "The last character is: %c\n" , testString[lastRuneIndex]) fmt.Printf( "The third word in the sentence is: '%s'\n" , testString[ 8 : 12 ]) ... |
Результатом этой программы будет:
1
2
3
4
|
This string has 26 characters The 3rd character is: i The last character is: g The third word in the sentence is: 'just' |
Синтаксис testString [8:12], используемый для извлечения подстроки, будет иметь больше смысла, когда мы рассмотрим массивы и срезы в следующей статье. Пока просто знайте, что число в левой части двоеточия является начальным индексом для подстроки, а число в правой части — конечным индексом.
Стандартные строковые функции Go
В Java класс String содержит множество методов для манипулирования, форматирования и поиска символов в строке. Другие базовые классы содержат методы для преобразования между String и другими распространенными типами данных (например, Integer.parseInt (s)).
В Go строка — это по сути встроенный примитивный тип, без методов. Поэтому стандартная библиотека Go содержит два пакета для заполнения этого пробела:
- Строки — Функции поиска и манипуляции. Поддерживаемые операции, включая разбиение и объединение, поиск символов и подстрок, преобразование в строчные или прописные буквы и т. Д.
- strconv — Функции для преобразования между строковыми и другими типами данных или форматами вывода.
Числовые Типы
Типы варьируются между платформами
Одна из хитростей при написании на C состоит в том, что типы данных могут варьироваться от одной платформы к другой. Int может занимать 32 бита на одном компьютере и 64 бита на другом. Виртуальная машина Java с ее мантрой «пиши один раз, беги куда угодно» скрывает это от программиста и обеспечивает согласованность типов данных на всех платформах.
Go — это частичный возврат, объединяющий элементы обоих. Если вам нужен определенный размер, вы можете объявить определенный числовой тип (например, int32, int64). Однако если вы просто объявите переменную как int, то ее размер может варьироваться от 32 до 64 бит в зависимости от платформы.
На практике это не имеет большого значения. Даже в худшем случае диапазон 32-битного int достаточен для большинства обычных задач. Кроме того, неоднозначный int — это тип данных, используемый для индексации массивов и фрагментов (будет рассмотрено в следующей статье). Итак, общая лучшая практика заключается в следующем:
- используйте int, когда вам нужно что-то 32-битное, и вам все равно, больше ли оно
- используйте более конкретный тип только тогда, когда вам действительно нужен больший или меньший диапазон номеров
В целом, это целочисленные типы и типы с плавающей точкой, доступные в Go, а также диапазон возможных значений для каждого:
Иди типа | Java эквивалент | Спектр |
int8 | байт | От -128 до 127 |
int16 | короткая | От -32 768 до 32 767 |
int32 | ИНТ | От -32 768 до 32 767 |
int64 | долго | От -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 |
float32 | поплавок | 1.40129846432481707e-45 до 3.40282346638528860e + 38, положительный или отрицательный |
float64 | двойной | 4.94065645841246544e-324d до 1.79769313486231570e + 308d, положительный или отрицательный |
В Go также предусмотрены типы complex64 и complex128 для сложных математических операций с мнимыми числами. Прямого эквивалента в библиотеке Java нет, хотя вы можете найти похожие типы данных в проекте Apache Commons Math .
Обратите внимание, что хотя Go имеет неоднозначный тип int, который может быть 32-разрядным или 64-разрядным в зависимости от платформы, универсального типа с плавающей запятой не существует. Вы должны указать float32 или float64. В отличие от целочисленных типов, которые отличаются только диапазоном чисел, которые они могут содержать, существуют тонкие различия в том, как 32-разрядные и 64-разрядные числа с плавающей запятой обрабатывают точность. Вот почему Java-разработчики обычно используют BigDecimal для финансовых транзакций! Говоря об этом, стандартная библиотека Go предлагает эквивалентные типы в пакете « математика / большой ». Тип Go типа Int похож на BigInteger в Java, а Rat Go (сокращенно от «рациональный») похож на BigDecimal в Java.
Go имеет подписанные и неподписанные целые
Все целочисленные примитивы в Java подписаны. Это означает, что если Java — ваш единственный язык программирования, вы можете даже не знать о разнице между знаковыми и беззнаковыми числами! По сути, целое число со знаком может быть как положительным, так и отрицательным, тогда как целое число без знака может быть только от нуля и выше. Таким образом, с беззнаковыми типами вы можете удвоить диапазон из одного и того же пространства памяти, так что вам не нужно хранить отрицательные значения.
Иди типа | Спектр |
uint8 | От 0 до 255 |
uint16 | От 0 до 65 535 |
uint32 | От 0 до 4 294 967 295 |
uint64 | От 0 до 18 446 744 073 709 551 615 |
Вывод
Есть несколько причуд, на которые вы должны обратить внимание с примитивными типами Go, такими как возможность строки, содержащей двоичные данные, или тот факт, что целые числа различаются по размеру между платформами. В целом, однако, многие вещи о примитивах Go могут быть глотком свежего воздуха для вас, как программиста на Java. Нет никакой бифуркации Java между «примитивами» и «обёртками объектов», и нет автобокса. Более того, если вы не решите создать указатель, исключений NullPointerException не существует!
В следующей статье мы рассмотрим создание пользовательских типов в Go и то, как система типов Go отличается от объектной ориентации в Java.
Ссылка: | Пойдите для программистов Java: Простые типы от нашего партнера JCG Стива Перкинса в блоге steveperkins.net . |