> For the complete documentation index, see [llms.txt](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yuliyas-organization-3.gitbook.io/prokhodim-sobesedovanie-na-golang-razrabotchika/golang-teoriya/tipy-dannykh.md).

# Типы данных

<details>

<summary>Какие есть встроенные типы данных в golang?</summary>

В языке программирования Go (или Golang) предусмотрен ряд встроенных типов данных, которые можно разделить на несколько категорий: базовые типы, составные типы, специальные типы и интерфейсы. Вот основные встроенные типы данных в Go:

#### Базовые типы:

1. **Boolean типы:**
   * `bool` — логический тип данных, принимающий значения `true` или `false`.
2. **Целочисленные типы:**
   * `int`, `int8`, `int16`, `int32`, `int64` — целые числа с знаком различной битности.
   * `uint`, `uint8`, `uint16`, `uint32`, `uint64`, `uintptr` — целые числа без знака различной битности. `uintptr` — беззнаковый целочисленный тип, размер которого достаточен для хранения указателя.
3. **Типы с плавающей точкой:**
   * `float32`, `float64` — числа с плавающей точкой (вещественные числа) различной точности.
4. **Комплексные числа:**
   * `complex64`, `complex128` — комплексные числа с плавающей точкой, где `complex64` использует два `float32` для представления вещественной и мнимой частей, а `complex128` использует два `float64`.
5. **Типы символов и строк:**
   * `byte` — синоним для `uint8`, представляет собой байт.
   * `rune` — синоним для `int32`, представляет Unicode кодовую точку.
   * `string` — строковый тип, представляющий собой последовательность байтов (обычно это текст в кодировке UTF-8).

#### Составные типы:

1. **Массивы:**
   * Пример: `var a [10]int` — массив из десяти целых чисел.
2. **Срезы (slices):**
   * Пример: `var s []int` — срез целых чисел.
3. **Структуры (structs):**
   * Пример: `struct { name string; age int }` — структура с полями `name` и `age`.
4. **Карты (maps):**
   * Пример: `map[string]int` — карта с ключами типа `string` и значениями типа `int`.
5. **Каналы (channels):**
   * Пример: `chan int` — канал для передачи целых чисел.

#### Специальные типы:

1. **Интерфейсы (interfaces):**
   * Пример: `interface{}` — пустой интерфейс, может содержать значение любого типа.
2. **Функции:**
   * Пример: `func(int) float64` — функция, принимающая `int` и возвращающая `float64`.

#### Использование типов данных:

В Go типы данных строго определены, и компилятор проверяет соответствие типов во время компиляции. Это помогает предотвратить многие ошибки, связанные с типами данных, и делает код более безопасным и предсказуемым.

</details>

<details>

<summary>Алиасом чего является byte и rune в golang?</summary>

В языке программирования Go, типы данных byte и rune являются алиасами для других типов данных:

* **byte** является алиасом для типа **uint8**. Он представляет собой 8-битное целое число без знака, используемое для представления ASCII символов и других 8-битных данных\[5].
* **rune** является алиасом для типа **int32**. Этот тип данных используется для представления символов Юникода (Unicode characters) в кодировке UTF-32 aka UCS-4. Rune представляет собой 32-битное целое число со знаком и используется для работы с не-ASCII символами в строках\[1]\[5].

Таким образом, в Go тип данных byte используется для работы с 8-битными данными, включая ASCII символы, в то время как тип данных rune используется для работы с символами Юникода в кодировке UTF-32\[1]\[5].

Citations: \[1] <https://ru.stackoverflow.com/questions/1567519/rune-%D0%B8-byte-%D0%B2-%D1%87%D1%91%D0%BC-%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0> \[2] <https://ru.hexlet.io/courses/go-basics/lessons/string-runes/theory\\_unit> \[3] <https://code-basics.com/ru/languages/go/lessons/strings-runes> \[4] <https://vc.ru/u/1389654-machine-learning/695828-golang-stroki-i-runy> \[5] <https://www.bogotobogo.com/GoLang/GoLang\\_byte\\_and\\_rune.php>

</details>

<details>

<summary>Как строки представлены в golang?</summary>

В языке программирования Go строки представлены как неизменяемые последовательности байтов. Основные характеристики строк в Go включают следующие аспекты:

1. **Неизменяемость**: Строки в Go являются неизменяемыми, что означает, что после их создания содержимое строки не может быть изменено. Любые операции, которые кажутся изменяющими строку, на самом деле создают новую строку.
2. **UTF-8**: Строки в Go по умолчанию кодируются с использованием UTF-8. Это международная стандартная кодировка, которая может представлять любой символ в мире и совместима с ASCII. Каждый символ может занимать от 1 до 4 байтов, в зависимости от символа.
3. **Представление**: В памяти строка представлена как последовательность байтов (не символов), что важно помнить при работе с многобайтовыми символами UTF-8. Строка в Go также хранит информацию о своей длине, что позволяет быстро получить длину строки без необходимости её перебора.
4. **Индексация**: При индексации строки `s[i]` возвращается байт, а не символ. Это означает, что если строка содержит многобайтовые символы UTF-8, прямая индексация может возвращать байты, которые не представляют полные символы. Для правильной работы с символами следует использовать пакет `unicode/utf8` или перебирать строку с помощью `range`, который корректно обрабатывает символы UTF-8.
5. **Операции со строками**: Go предоставляет ряд встроенных операций для работы со строками, таких как конкатенация (`+`), получение подстроки (срезы), а также стандартные функции в пакете `strings` для поиска, замены, разделения строк и т.д.

Пример работы со строками в Go:

```go
package main

import (
    "fmt"
)

func main() {
    s := "Hello, 世界"
    fmt.Println(len(s)) // Выведет количество байт в строке, а не количество символов

    for i, r := range s {
        fmt.Printf("%d: %q\n", i, r) // Корректно обрабатывает символы UTF-8
    }
}
```

В этом примере строка `s` содержит как ASCII символы, так и символы, закодированные в UTF-8, которые занимают более одного байта. Использование `range` позволяет корректно итерировать по символам, а не по байтам.

</details>
