---
title: Типы данных
seo:
  title: Типы данных — Go Developer
  description: Тема «Типы данных» для собеседования Go Developer. Какие бывают типы в Go? В чем отличие uint от int?
---

[Все темы Go Developer](/go-developer)

## <strong>Какие бывают типы в Go?</strong> [#q-14bee738d69b8155adcee51c82594c90]

Типы данных в Go&#58;

{/* prettier-ignore */}
1. <strong>Базовые типы</strong>&#58;

    - <strong>Числовые</strong>&#58;

        - Целые&#58; <code>int</code>, <code>int8</code>, <code>int16</code>, <code>int32</code>, <code>int64</code>, <code>uint</code>, <code>uint8</code>, <code>uint16</code>, <code>uint32</code>, <code>uint64</code>, <code>uintptr</code>

        - С плавающей точкой&#58; <code>float32</code>, <code>float64</code>

        - Комплексные&#58; <code>complex64</code>, <code>complex128</code>

    - <strong>Логические</strong>&#58; <code>bool</code>

    - <strong>Символьные</strong>&#58; <code>byte</code> (alias для <code>uint8</code>), <code>rune</code> (alias для <code>int32</code>, используется для представления Unicode символов)

    - <strong>Строки</strong>&#58; <code>string</code>

1. <strong>Составные типы</strong>&#58;

    - <strong>Массивы</strong>&#58; <code>&#91;n&#93;T</code> (фиксированного размера)

    - <strong>Слайсы</strong>&#58; <code>&#91;&#93;T</code> (динамического размера)

    - <strong>Структуры</strong>&#58; <code>struct</code>

    - <strong>Карты (map)</strong>&#58; <code>map&#91;K&#93;V</code> (ассоциативные массивы)

    - <strong>Каналы</strong>&#58; <code>chan T</code> (для передачи данных между горутинами)

1. <strong>Интерфейсы</strong>&#58;

    - <strong>Интерфейсные типы</strong>&#58; <code>interface&#123;&#125;</code> (позволяют определять методы, которые должен реализовывать тип)

1. <strong>Указатели</strong>&#58;

    - Указатели&#58; \*T (указатель на значение типа T).

#### Примеры&#58;

- <strong>Числовые</strong>&#58;

  ```go
  var i int = 42
  var f float64 = 3.14
  ```

- <strong>Строки и логические</strong>&#58;

  ```go
  var s string = "Hello, Go!"
  var b bool = true
  ```

- <strong>Составные</strong>&#58;

  ```go
  var arr [3]int = [3]int{1, 2, 3}
  var slice []int = []int{1, 2, 3}
  var m map[string]int = map[string]int{"a": 1, "b": 2}
  ```

- <strong>Указатели</strong>&#58;

  ```go
  var p *int
  ```

Эти типы обеспечивают широкий спектр возможностей для разработки приложений в Go.

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>В чем отличие</strong> <code>uint</code> <strong>от</strong> <code>int</code><strong>?</strong> [#q-14bee738d69b811083ced0ac6bb666ec]

Основное отличие между <code>uint</code> и <code>int</code>&#58;

{/* prettier-ignore */}
- <code>int</code>&#58;

    - <strong>Знак</strong>&#58; Знаковый тип данных, может содержать как положительные, так и отрицательные значения.

    - <strong>Диапазон</strong>&#58; Диапазон значений зависит от разрядности платформы (32 или 64 бита). Например, для 32-битной платформы диапазон <code>int</code> составляет от -2,147,483,648 до 2,147,483,647.

    - <strong>Пример</strong>&#58;

        ```go
        var i int = -42
        ```

- <code>uint</code>&#58;

    - <strong>Знак</strong>&#58; Беззнаковый тип данных, может содержать только неотрицательные значения.

    - <strong>Диапазон</strong>&#58; Диапазон значений также зависит от разрядности платформы. Для 32-битной платформы диапазон <code>uint</code> составляет от 0 до 4,294,967,295.

    - <strong>Пример</strong>&#58;

        ```go
        var u uint = 42
        ```

#### Особенности&#58;

{/* prettier-ignore */}
- <strong>Применение</strong>&#58;

    - Используйте <code>int</code>, когда необходимы как положительные, так и отрицательные значения.

    - Используйте <code>uint</code>, когда значения не могут быть отрицательными (например, для счетчиков, индексов).

#### Пример сравнения&#58;

```go
package main

import "fmt"

func main() {
    var i int = -10
    var u uint = 10

    fmt.Println(i)  // Вывод: -10
    fmt.Println(u)  // Вывод: 10
}
```

Эти типы данных обеспечивают гибкость и эффективность работы с различными диапазонами значений в Go.

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Что такое обычный</strong> <code>int</code> <strong>и какие есть нюансы его реализации?</strong> [#q-14bee738d69b8156aeaff1e6c5d5e94e]

Обычный <code>int</code> в Go&#58;

{/* prettier-ignore */}
- <strong>Определение</strong>&#58; <code>int</code> — это знаковый целочисленный тип данных, который может содержать как положительные, так и отрицательные значения.

- <strong>Размер</strong>&#58; Размер <code>int</code> зависит от платформы&#58;

    - На 32-битных платформах&#58; <code>int</code> имеет размер 32 бита.

    - На 64-битных платформах&#58; <code>int</code> имеет размер 64 бита.

- <strong>Диапазон значений</strong>&#58;

    - На 32-битных платформах&#58; от -2,147,483,648 до 2,147,483,647.

    - На 64-битных платформах&#58; от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.

#### Нюансы реализации&#58;

{/* prettier-ignore */}
1. <strong>Платформозависимость</strong>&#58;

    - Размер и диапазон <code>int</code> зависят от архитектуры платформы, что следует учитывать при переносе кода между 32-битными и 64-битными системами.

1. <strong>Производительность</strong>&#58;

    - Использование <code>int</code> может быть более производительным на платформе, соответствующей его разрядности, поскольку операции над <code>int</code> оптимизируются для текущей архитектуры.

1. <strong>Использование</strong>&#58;

    - Рекомендуется использовать <code>int</code> для общих случаев, если не требуется фиксированный размер или диапазон, поскольку это обеспечивает лучшую производительность и удобство.

#### Пример использования <code>int</code>&#58;

```go
package main

import "fmt"

func main() {
    var i int = 42
    fmt.Println(i)  // Вывод: 42
}
```

Обычный <code>int</code> в Go является удобным и производительным типом данных для целых чисел, но его размер зависит от платформы, что нужно учитывать при разработке кроссплатформенных приложений.

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Как преобразовать строку в</strong> <code>int</code> <strong>и наоборот? Можно ли сделать</strong> <code>int&#40;string&#41;</code> <strong>и</strong> <code>string&#40;int&#41;</code> <strong>соответственно?</strong> [#q-14bee738d69b816b9e8df4ff7e8d2def]

Преобразование строки в <code>int</code>&#58;

Для преобразования строки в <code>int</code> используйте функцию <code>strconv&#46;Atoi</code> из пакета <code>strconv</code>.

```go
import (
    "fmt"
    "strconv"
)

func main() {
    str := "42"
    num, err := strconv.Atoi(str)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Converted to int:", num)
    }
}
```

Для преобразования <code>int</code> в строку используйте функцию <code>strconv&#46;Itoa</code>.

```go
import (
    "fmt"
    "strconv"
)

func main() {
    num := 42
    str := strconv.Itoa(num)
    fmt.Println("Converted to string:", str)
}
```

int("123") недопустимо. Преобразование string(123) допустимо, но возвращает строку с кодовой точкой U+007B, то есть "\{", а не десятичную запись "123". Для десятичной записи используйте strconv.Itoa.

```go
// int("123") — ошибка компиляции
s := string(123) // "{", кодовая точка U+007B
fmt.Println(s)
```

Используйте функции из пакета <code>strconv</code> для правильного и безопасного преобразования между строками и целыми числами.

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Сколько в памяти занимают реализации</strong> <code>int32</code> <strong>и</strong> <code>int64</code><strong>?</strong> [#q-14bee738d69b818bb98cc7de06c7166a]

Размер в памяти для <code>int32</code> и <code>int64</code>&#58;

- <code>int32</code>&#58; Занимает 4 байта (32 бита) в памяти.

- <code>int64</code>&#58; Занимает 8 байт (64 бита) в памяти.

#### Пример&#58;

- <strong>int32</strong>&#58; 4 байта = 32 бита

  ```go
  var i int32 = 42
  ```

- <strong>int64</strong>&#58; 8 байт = 64 бита

  ```go
  var j int64 = 42
  ```

Эти размеры фиксированы и не зависят от платформы, в отличие от обычного <code>int</code>, который может иметь разный размер на 32-битных и 64-битных системах.

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Какие предельные значения</strong> <code>int32</code> <strong>и</strong> <code>int64</code><strong>?</strong> [#q-14bee738d69b81bb9165c66948c7e5bc]

Предельные значения <code>int32</code> и <code>int64</code>&#58;

{/* prettier-ignore */}
- <code>int32</code>&#58;

    - Минимальное значение&#58; −2 147 483 648 (−2^31).

    - Максимальное значение&#58; <code>2&#44;147&#44;483&#44;647</code> (<code>2&#94;31 &#45; 1</code>)

- <code>int64</code>&#58;

    - Минимальное значение&#58; −9 223 372 036 854 775 808 (−2^63).

    - Максимальное значение&#58; <code>9&#44;223&#44;372&#44;036&#44;854&#44;775&#44;807</code> (<code>2&#94;63 &#45; 1</code>)

#### Пример использования&#58;

```go
package main

import "fmt"

func main() {
    var i32_min int32 = -2147483648
    var i32_max int32 = 2147483647
    var i64_min int64 = -9223372036854775808
    var i64_max int64 = 9223372036854775807

    fmt.Println("int32 min:", i32_min)
    fmt.Println("int32 max:", i32_max)
    fmt.Println("int64 min:", i64_min)
    fmt.Println("int64 max:", i64_max)
}
```

Эти предельные значения определяют диапазон значений, которые могут быть представлены типами <code>int32</code> и <code>int64</code>.

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Какой результат получим если разделить</strong> <code>int</code> <strong>на 0 и</strong> <code>float</code> <strong>на 0?</strong> [#q-14bee738d69b81a68648d4bbaca24da9]

Деление на 0 в Go&#58;

{/* prettier-ignore */}
- <strong>int на 0</strong>&#58;

    - Деление целого числа на 0 вызывает панику во время выполнения.

    - Пример&#58;

        ```go
        var a int = 42
        var b int = 0
        // Результат: паника (runtime error: integer divide by zero)
        c := a / b
        ```

- <strong>float на 0</strong>&#58;

    - Деление числа с плавающей точкой на 0 не вызывает панику, но возвращает специальные значения.

    - Пример&#58;

        ```go
        var x float64 = 42.0
        var y float64 = 0.0
        // Результат: +Inf (положительная бесконечность)
        z := x / y
        fmt.Println(z)  // Вывод: +Inf
        ```

#### Особенности&#58;

- int&#58; деление на переменную со значением 0 вызывает панику. Константный нулевой делитель вызывает ошибку компиляции.

- float&#58; при вычислении во время выполнения возможны +Inf, −Inf или NaN. Деление констант на ноль запрещено компилятором.

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Что такое константы и можно ли их изменять?</strong> [#q-14bee738d69b814f817bd1a1eecb06f8]

<strong>Константы</strong> — это фиксированные значения, которые определяются на
этапе компиляции и не могут быть изменены во время выполнения программы.

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Объявление констант</strong>&#58;

    - Используется ключевое слово <code>const</code>.

    - Пример&#58;

        ```go
        const Pi = 3.14
        ```

1. <strong>Неизменяемость</strong>&#58;

    - Константы не могут быть изменены после их определения.

    - Пример&#58;

        ```go
        const Pi = 3.14
        // Pi = 3.1415  // Ошибка: попытка изменения константы
        ```

1. <strong>Типы констант</strong>&#58;

    - Константы могут быть числовыми (целыми и с плавающей точкой), строковыми или булевыми.

    - Примеры&#58;

        ```go
        const Greeting = "Hello, Go!"
        const MaxValue = 100
        const IsEnabled = true
        ```

#### Пример использования&#58;

```go
package main

import "fmt"

const Pi = 3.14

func main() {
    fmt.Println("Value of Pi:", Pi)
}
```

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Что такое</strong> <code>iota</code><strong>?</strong> [#q-14bee738d69b81c3a731c41459543f35]

iota — предопределенный идентификатор&#58; внутри const он равен индексу текущего ConstSpec, начиная с нуля. Несколько констант в одной спецификации используют одинаковое значение iota.

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Инициализация</strong>&#58;

    - <code>iota</code> начинается с 0 внутри блока <code>const</code> и увеличивается на 1 для каждой последующей константы.

    - Пример&#58;

        ```go
        const (
            A = iota  // 0
            B         // 1
            C         // 2
        )
        ```

1. <strong>Использование</strong>&#58;

    - Удобен для создания последовательностей иерархических значений, таких как дни недели, месяцы или типы состояний.

    - Пример&#58;

        ```go
        const (
            Sunday = iota  // 0
            Monday         // 1
            Tuesday        // 2
            Wednesday      // 3
            Thursday       // 4
            Friday         // 5
            Saturday       // 6
        )
        ```

1. <strong>Сброс в новых блоках</strong>&#58;

    - <code>iota</code> сбрасывается на 0 при входе в новый блок <code>const</code>.

    - Пример&#58;

        ```go
        const (
            X = iota  // 0
            Y         // 1
        )

        const (
            Z = iota  // 0
            W         // 1
        )
        ```

#### Пример использования&#58;

```go
package main

import "fmt"

const (
    Red = iota  // 0
    Green       // 1
    Blue        // 2
)

func main() {
    fmt.Println(Red, Green, Blue)  // Вывод: 0 1 2
}
```

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Что такое структура (</strong><code>struct</code><strong>) в Go? Зачем они нужны?</strong> [#q-14bee738d69b811fbbe4fd9d2e6af6f0]

<strong>Структура (</strong>
<code>struct</code>
<strong>)</strong> — это пользовательский тип данных, который позволяет
объединить несколько полей (переменных) под одним именем. Поля могут быть
разного типа.

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Объявление структуры</strong>&#58;

    - Определяется с помощью ключевого слова <code>type</code> и <code>struct</code>.

    - Пример&#58;

        ```go
        type Person struct {
            Name string
            Age  int
        }
        ```

1. <strong>Инициализация и использование</strong>&#58;

    - Создание экземпляра структуры и доступ к ее полям.

    - Пример&#58;

        ```go
        p := Person{Name: "Alice", Age: 30}
        fmt.Println(p.Name)  // Вывод: Alice
        fmt.Println(p.Age)   // Вывод: 30
        ```

#### Зачем нужны структуры&#58;

{/* prettier-ignore */}
1. <strong>Группировка данных</strong>&#58;

    - Структуры позволяют логически сгруппировать несколько значений разного типа в одном объекте.

    - Пример&#58; Сведения о человеке, включая имя и возраст.

1. <strong>Организация кода</strong>&#58;

    - Структуры помогают организовать и структурировать код, делая его более читаемым и поддерживаемым.

1. <strong>Моделирование реальных сущностей</strong>&#58;

    - Структуры используются для моделирования реальных объектов и сущностей в программе (например, клиент, продукт, заказ).

#### Пример использования структуры&#58;

```go
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "Bob", Age: 25}
    fmt.Println("Name:", p.Name)  // Вывод: Name: Bob
    fmt.Println("Age:", p.Age)    // Вывод: Age: 25
}
```

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Что такое тип</strong> <code>rune</code><strong>? Зачем их использовать?</strong> [#q-14bee738d69b81ed9ff8cca199719ad3]

<code>rune</code> — это алиас для типа <code>int32</code> и используется для
представления символов Unicode.

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Размер</strong>&#58;

    - <code>rune</code> занимает 4 байта (32 бита) в памяти, что позволяет хранить любой символ Unicode.

1. <strong>Использование</strong>&#58;

    - Применяется для работы с символами Unicode, обеспечивая поддержку международных символов и эмодзи.

#### Пример использования&#58;

```go
package main

import "fmt"

func main() {
    var ch rune = '世'
    fmt.Println(ch)        // Вывод: 19990 (кодовая точка Unicode)
    fmt.Printf("%c\\n", ch) // Вывод: 世 (символ)
}
```

#### Зачем использовать <code>rune</code>&#58;

{/* prettier-ignore */}
1. <strong>Поддержка Unicode</strong>&#58;

    - Позволяет корректно обрабатывать символы различных языков и специальные символы.

1. <strong>Явность кода</strong>&#58;

    - Делает код более явным и читаемым при работе с символами, так как <code>rune</code> указывает на работу с символами Unicode, а не просто с числами.

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::

---

## <strong>Что такое тип</strong> <code>byte</code><strong>?</strong> [#q-14bee738d69b81049888d38e6255bac8]

<code>byte</code> — это алиас для типа <code>uint8</code> и используется для
представления данных в байтах.

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Размер</strong>&#58;

    - <code>byte</code> занимает 1 байт (8 бит) в памяти, со значениями от 0 до 255.

1. <strong>Использование</strong>&#58;

    - Применяется для работы с сырыми данными и байтовыми последовательностями, такими как файлы, сетевые пакеты и строки.

#### Пример использования&#58;

```go
package main

import "fmt"

func main() {
    var b byte = 65
    fmt.Println(b)        // Вывод: 65
    fmt.Printf("%c\\n", b) // Вывод: A (символ с кодом ASCII 65)
}
```

#### Зачем использовать <code>byte</code>&#58;

{/* prettier-ignore */}
1. <strong>Работа с сырыми данными</strong>&#58;

    - Удобен для манипуляций с данными на низком уровне, такими как чтение и запись файлов, обработка сетевых пакетов.

1. <strong>Представление строк</strong>&#58;

    - В Go строки представляют собой последовательности байтов, поэтому <code>byte</code> часто используется при работе с символами ASCII и UTF-8.

:::note[Ссылки для изучения]

1. [Типы данных в Go](https://timeweb.cloud/tutorials/go/tipy-dannyh-v-go)
   :::
