# Базовые типы данных

Врага нужно знать в лицо. Этим безотлагательно и займёмся.

В первую очередь нам следует запомнить, что Go является компилируемым языком со строгой типизацией. С этой позиции и будем двигаться дальше.  ~~Все счастливые семьи похожи друг на друга.~~ Несмотря на то, что во всех языках база - это плюс-минус одинаково, в Go есть свои нюансы, которые надо знать.

В текущей реализации языка я насчитал 19 базовых типов данных, включая алиасы:

| <p><strong>bool</strong></p><p><strong>string</strong></p><p><strong>int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr</strong></p><p><strong>byte</strong> // алиас для uint8</p><p><strong>rune</strong> // алиас для int32, представляет номер данного Unicode символа (специфический для Go тип, зато тип char отсутствует)</p><p><strong>float32 float64</strong></p><p><strong>complex64 complex128</strong></p> |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

## BOOL

**Булев тип** предсказуемо занимает 1 байт. В Go этот тип переменных отличен тем, что, не привязан к числовым эквивалентам как, к примеру, в языке C, где таковые эквиваленты вовсе подменяют собой отсутствующий тип bool. То есть 0 автоматически не равен false, а значащее число - true. Более того, не поможет и явное приведение типов:

```go
fmt.Println(bool(0))
//cannot convert 0 (type untyped number) to type bool
```

Однако логика предикатов ожидаемо работает, и математические выражения в булевом контексте могут трактоваться как значения бинарной true/false логики:

```c
fmt.Println(2 > 1)
//true
```

## **STRING**

**Строковый тип** идёт со встроенной поддержкой юникода и только юникода (UTF-8). Байтовые последовательности прочих кодировок при оказии приходится всегда конвертировать с целью читаемости. Как к примеру в C#, строка в Go представляет собою неизменяемую последовательность байтов. То есть она как бы и массив (да и вообще строки и байтовые массивы - это как корпускулярно-волновой дуализм), однако строго необходимо помнить, что вольности, подобные таковым, не допускаются компилятором:

```go
var str = "henep"
fmt.Println(str[0])
// 104 (0x68 hex) - как видим, строка тут же стремится к первородному массиву []byte
fmt.Println(string(str[0]))
// вот теперь "h", без явного приведения типов никуда
str[0] = "s"
//cannot assign to str[0]
```

Как видите, компилятор не дал нам уподобиться Тилю Уленшпигелю и смешать "henep" и "senep" =)

К всякой строке может быть применена встроенная функция **len,** возвращающая длину подлежащего байтового массива, но никак не количество символов. Снова из-за строки выглядывают ослиные уши байтового массива, поскольку любой UTF-8 символ, не совпадающий с ASCII таблицей, потребует для своего выражения от 2 до 4 байтов. Достаточно взглянуть на богатство и разнообразие национальных языков и распространённых символов, которые вобрала в себя UTF.Кроме прочего, вы немало ошибётесь, если сведёте вопрос к  символьно-байтовому дуализму. Ведь есть ещё таинственные **руны**! Так что, впереди нас ещё ожидает весьма увлекательное исследование строко-байто-рунного единения (трёхкваркового конфайнмента?) в трёх лицах и функций для освоения всего этого хозяйства. Это не сложно.

Как водится, строки подвержены конкатенации:

```go
var str1, str2 = "Hello", "world!"
fmt.Println(str1 + " " + str2)
```

Поскольку параметром функции Println() пакета fmt является тип intarface (базовый для прочих, как object в C#), возможны конструкции с гетерогенными включениями:

```go
fmt.Println("Завтра сыну исполнится", 10, "лет!")
// или даже как-то так:
fmt.Println("Time now is:",time.Now().Format(time.Kitchen))
```

Разумеется, в проект должны быть включены пакеты "fmt" и "time", объявлена функция main, что было опущено для краткости изложения.

Также существует понятие так называемого "raw string literal". По смыслу это соответствует строкам с символом @ в C# или тегу  в HTML. Синтаксическим представляет собой косые кавычки **\` \`**, те, что живут на букве "ё". Я часто использую такие литералы для интеграции в скомпилированный бинарник внешних ресурсов вроде картинок в формате base64.

Забегая вперёд, хочу продемонстрировать,  какого рода в рамках "строко-байтового дуализма", возможны операции  со строками:

```go
package main

import (
	"fmt"
)

func main() {
	var str1, str2 = "Hello ", "world!"
	fmt.Println(string(append([]byte(str1), []byte(str2)...)))

}
//Hello world!
```

Вот такая, с позволения сказать , конкатенация. Если размыслить, для меня это как у физиков - выражают же массы частиц в энергетическом эквиваленте. Масса T кварка  173,2 ± 0,7 ГэВ, и ничего, все радуются. Синхрофазотрон и полчаса работы лобзиком =)

Хотел удержаться, и обуздать размах мысли в целях соблюдения святой лапидарности, но всё же приведу таблицу HEX dictionary:

## Hex to ASCII text conversion table

| Hexadecimal | Binary   | <p>ASCII<br>Character</p> |
| ----------- | -------- | ------------------------- |
| 00          | 00000000 | NUL                       |
| 01          | 00000001 | SOH                       |
| 02          | 00000010 | STX                       |
| 03          | 00000011 | ETX                       |
| 04          | 00000100 | EOT                       |
| 05          | 00000101 | ENQ                       |
| 06          | 00000110 | ACK                       |
| 07          | 00000111 | BEL                       |
| 08          | 00001000 | BS                        |
| 09          | 00001001 | HT                        |
| 0A          | 00001010 | LF                        |
| 0B          | 00001011 | VT                        |
| 0C          | 00001100 | FF                        |
| 0D          | 00001101 | CR                        |
| 0E          | 00001110 | SO                        |
| 0F          | 00001111 | SI                        |
| 10          | 00010000 | DLE                       |
| 11          | 00010001 | DC1                       |
| 12          | 00010010 | DC2                       |
| 13          | 00010011 | DC3                       |
| 14          | 00010100 | DC4                       |
| 15          | 00010101 | NAK                       |
| 16          | 00010110 | SYN                       |
| 17          | 00010111 | ETB                       |
| 18          | 00011000 | CAN                       |
| 19          | 00011001 | EM                        |
| 1A          | 00011010 | SUB                       |
| 1B          | 00011011 | ESC                       |
| 1C          | 00011100 | FS                        |
| 1D          | 00011101 | GS                        |
| 1E          | 00011110 | RS                        |
| 1F          | 00011111 | US                        |
| 20          | 00100000 | Space                     |
| 21          | 00100001 | !                         |
| 22          | 00100010 | "                         |
| 23          | 00100011 | #                         |
| 24          | 00100100 | $                         |
| 25          | 00100101 | %                         |
| 26          | 00100110 | &                         |
| 27          | 00100111 | '                         |
| 28          | 00101000 | (                         |
| 29          | 00101001 | )                         |
| 2A          | 00101010 | \*                        |
| 2B          | 00101011 | +                         |
| 2C          | 00101100 | ,                         |
| 2D          | 00101101 | -                         |
| 2E          | 00101110 | .                         |
| 2F          | 00101111 | /                         |
| 30          | 00110000 | 0                         |
| 31          | 00110001 | 1                         |
| 32          | 00110010 | 2                         |
| 33          | 00110011 | 3                         |
| 34          | 00110100 | 4                         |
| 35          | 00110101 | 5                         |
| 36          | 00110110 | 6                         |
| 37          | 00110111 | 7                         |
| 38          | 00111000 | 8                         |
| 39          | 00111001 | 9                         |
| 3A          | 00111010 | :                         |
| 3B          | 00111011 | ;                         |
| 3C          | 00111100 | <                         |
| 3D          | 00111101 | =                         |
| 3E          | 00111110 | >                         |
| 3F          | 00111111 | ?                         |
| 40          | 01000000 | @                         |
| 41          | 01000001 | A                         |
| 42          | 01000010 | B                         |
| 43          | 01000011 | C                         |
| 44          | 01000100 | D                         |
| 45          | 01000101 | E                         |
| 46          | 01000110 | F                         |
| 47          | 01000111 | G                         |
| 48          | 01001000 | H                         |
| 49          | 01001001 | I                         |
| 4A          | 01001010 | J                         |
| 4B          | 01001011 | K                         |
| 4C          | 01001100 | L                         |
| 4D          | 01001101 | M                         |
| 4E          | 01001110 | N                         |
| 4F          | 01001111 | O                         |
| 50          | 01010000 | P                         |
| 51          | 01010001 | Q                         |
| 52          | 01010010 | R                         |
| 53          | 01010011 | S                         |
| 54          | 01010100 | T                         |
| 55          | 01010101 | U                         |
| 56          | 01010110 | V                         |
| 57          | 01010111 | W                         |
| 58          | 01011000 | X                         |
| 59          | 01011001 | Y                         |
| 5A          | 01011010 | Z                         |
| 5B          | 01011011 | \[                        |
| 5C          | 01011100 | \\                        |
| 5D          | 01011101 | ]                         |
| 5E          | 01011110 | ^                         |
| 5F          | 01011111 | \_                        |
| 60          | 01100000 | \`                        |
| 61          | 01100001 | a                         |
| 62          | 01100010 | b                         |
| 63          | 01100011 | c                         |
| 64          | 01100100 | d                         |
| 65          | 01100101 | e                         |
| 66          | 01100110 | f                         |
| 67          | 01100111 | g                         |
| 68          | 01101000 | h                         |
| 69          | 01101001 | i                         |
| 6A          | 01101010 | j                         |
| 6B          | 01101011 | k                         |
| 6C          | 01101100 | l                         |
| 6D          | 01101101 | m                         |
| 6E          | 01101110 | n                         |
| 6F          | 01101111 | o                         |
| 70          | 01110000 | p                         |
| 71          | 01110001 | q                         |
| 72          | 01110010 | r                         |
| 73          | 01110011 | s                         |
| 74          | 01110100 | t                         |
| 75          | 01110101 | u                         |
| 76          | 01110110 | v                         |
| 77          | 01110111 | w                         |
| 78          | 01111000 | x                         |
| 79          | 01111001 | y                         |
| 7A          | 01111010 | z                         |
| 7B          | 01111011 | {                         |
| 7C          | 01111100 | \|                        |
| 7D          | 01111101 | }                         |
| 7E          | 01111110 | \~                        |
| 7F          | 01111111 | DEL                       |

## Целочисленные типы

Первое, что о них нужно понимать, так это то, что они подвержены переполнению, что свойственно далеко не всем языкам (тому же, Pascal). Как и положено, существует "простой" архитектурно зависимый  **int** . За ним следуют целые числа со знаком фиксированного размера — **int8**, **int16**, **int32**, **int64** с аналогичным размером 8, 16, 32, 64 бита соответственно. Для исчисления диапазона значений данных типов необходимо воспользоваться формулой: −2n−1 до 2n−1−1, где n — размер типа.&#x20;

Также, присутствуют и аналогичные беззнаковые  типы - "обобщённый" **uint**, а также **uint8**, **uint16,** **uint32,** **uint64**. Число в названии типа, как и в предыдущем случае, задаёт размер, но диапазон значений составляет от 0 до 2n−1.

Рискуя заглянуть далеко вперёд, сообщу о том, что для преодоления ограничения домена значений переменных, к примеру uint64, а также осуществления операций с большими числами может использоваться специальный пакет "math/big", а также некоторые хитрости с нетипизированными константами, чья арифметика обрабатывается с гораздо большей числовой точностью, чем значения фундаментальных типов. Подробнее об этом мы поговорим позже.

## Вещественные числа

Здесь всё предсказуемо. Числа с плавающей точкой представлены двумя типами - float32 и float64 - соответственно с простой и двойной точностью. Их размер составляет ожидаемые 32 и 64 бита в реализация соответствует стандарту IEEE 754. Размерность данных типов (так же как и, впрочем, всех целочисленных) можно увидеть, используя пакет "math":

```go
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.MaxFloat32)
	fmt.Println(math.MaxFloat64)
}
//3.4028234663852886e+38
//1.7976931348623157e+308
```

## &#x20;math/big

Появление этого пакета в стандартной библиотеке Go  привело к обсуждению такой сущности как **числовые типы с неограниченной точностью.** Позже я покажу на развёрнутом примере декодирования аппаратной информации (CID) вендора SD карт работу с пакетом math/big,         большими числами, и даже битовыми оперциями с ними.

## Комплексные числа

Физики любят говорить кОмпплексные,  математики произносят комплЕксные числа.... Оставим это дело для математиков. Я же для красоты приведу вам такой код:

```go
package main

import (
	"fmt"
	"image"
	"image/color"
	. "image/png"
	"log"
	"math/cmplx"
	"net/http"
)

var resultImg *image.RGBA

func handler(w http.ResponseWriter, r *http.Request) {
	f := Encode(w, resultImg)
	fmt.Fprintf(w, "%s", f)
}

func newton(z complex128) color.Color {
	const iterations = 37
	const contrast = 7
	for i := uint8(0); i < iterations; i++ {
		z -= (z - 1/(z*z*z)) / 4
		if cmplx.Abs(z*z*z*z-1) < 1e-6 {
			return color.Gray{255 - contrast*i}
		}
	}
	return color.Black
}

func main() {
	const (
		xmin, ymin, xmax, ymax = -2, -2, +2, +2
		width, height          = 1024, 1024
	)

	img := image.NewRGBA(image.Rect(0, 0, width, height))
	for py := 0; py < height; py++ {
		y := float64(py)/height*(ymax-ymin) + ymin
		for px := 0; px < width; px++ {
			x := float64(px)/width*(xmax-xmin) + xmin
			z := complex(x, y)
			// Image point (px, py) represents complex value z.
			img.Set(px, py, newton(z))
		}
	}

	resultImg = img

	http.HandleFunc("/", handler)

	log.Println("Socket waiting connection on * : 3000")
	log.Fatal(http.ListenAndServe(":3000", nil))

}
```

&#x20;Скомпилировав и запустив его, зайдите в любом браузере на страницу <http://localhost:3000> и получите эстетическое наслаждение. То самое, которое несёт математика в своей стройности. Ах да, я же совсем забыл рассказать о сборке программ и установке нужных для этого компонентов! Что ж, исправляюсь!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.golang.org.ua/tipy-dannykh.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
