---
title: Строки
seo:
  title: Строки — Go Developer
  description: Тема «Строки» для собеседования Go Developer. Что из себя представляет тип данных string в языке Go? Можно ли изменить определенный символ в строке?
---

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

## <strong>Что из себя представляет тип данных</strong> <code>string</code> <strong>в языке Go?</strong> [#q-14bee738d69b8175aab2d0e7f43d8478]

<code>string</code> — это неизменяемая последовательность байтов, которая
используется для представления текста.

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

{/* prettier-ignore */}
1. <strong>Неизменяемость</strong>&#58;

    - Строки в Go неизменяемы; однажды созданные, их содержимое не может быть изменено.

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

    - Строки представляют собой последовательность байтов, что позволяет хранить текст в формате UTF-8.

    - Каждый элемент строки — это байт (тип <code>byte</code>).

1. <strong>Создание и инициализация</strong>&#58;

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

    - Пример&#58;

        ```go
        var s string = "Hello, Go!"
        ```

1. <strong>Длина</strong>&#58;

    - Длину строки можно получить с помощью функции <code>len</code>.

    - Пример&#58;

        ```go
        length := len(s)  // Возвращает количество байтов в строке
        ```

1. <strong>Конкатенация</strong>&#58;

    - Строки можно объединять с помощью оператора <code>&#43;</code>.

    - Пример&#58;

        ```go
        s1 := "Hello, "
        s2 := "Go!"
        result := s1 + s2  // "Hello, Go!"
        ```

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

1. [Манипуляция со строками в Go](https://golangify.com/string)
   :::

---

## <strong>Можно ли изменить определенный символ в строке?</strong> [#q-14bee738d69b818694bde7b5fb62b7c3]

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

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

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

   ```go
   s := "hello"
   runes := []rune(s)
   runes[0] = 'H'
   newStr := string(runes)
   fmt.Println(newStr)  // Вывод: Hello
   ```

1. <strong>Преобразование строки в слайс байтов</strong> (если работаешь с
   ASCII)&#58;

   ```go
   s := "hello"
   bytes := []byte(s)
   bytes[0] = 'H'
   newStr := string(bytes)
   fmt.Println(newStr)  // Вывод: Hello
   ```

Таким образом, для изменения символа в строке в Go нужно преобразовать строку в изменяемую структуру данных (слайс рун или байтов), внести изменения и создать новую строку.

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

1. [Манипуляция со строками в Go](https://golangify.com/string)
   :::

---

## <strong>Что происходит при склеивании строк?</strong> [#q-14bee738d69b81309d3ae74f10f6c0c8]

При склеивании (конкатенации) строк в Go создается новая строка, содержащая последовательность байтов из всех исходных строк. Исходные строки остаются неизменными.

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

```go
s1 := "Hello, "
s2 := "Go!"
result := s1 + s2
fmt.Println(result)  // Вывод: Hello, Go!
```

#### Процесс&#58;

1. <strong>Выделение памяти</strong>&#58; Выделяется новая память для хранения
   объединенной строки.

1. <strong>Копирование байтов</strong>&#58; Байты из всех исходных строк
   копируются в новый выделенный участок памяти.

1. <strong>Создание новой строки</strong>&#58; Формируется новая строка,
   представляющая результат конкатенации.

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

- <strong>Неизменяемость</strong>&#58; Исходные строки не изменяются.

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

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

1. [Манипуляция со строками в Go](https://golangify.com/string)
   :::

---

## <strong>Как можно оперировать строками?</strong> [#q-14bee738d69b8158be1aebfa607040c5]

Операции со строками в Go&#58;

{/* prettier-ignore */}
1. <strong>Конкатенация</strong>&#58;

    - Объединение строк с помощью оператора <code>&#43;</code>.

    ```go
    s1 := "Hello, "
    s2 := "Go!"
    result := s1 + s2
    fmt.Println(result)  // Вывод: Hello, Go!
    ```

1. <strong>Длина строки</strong>&#58;

    - Получение длины строки с помощью функции <code>len</code>.

    ```go
    s := "Hello"
    length := len(s)
    fmt.Println(length)  // Вывод: 5
    ```

1. <strong>Доступ к символам</strong>&#58;

    - Доступ к символам строки через индексацию (возвращает байт).

    ```go
    s := "Hello"
    firstChar := s[0]
    fmt.Printf("%c\\n", firstChar)  // Вывод: H
    ```

1. <strong>Срезы строк</strong>&#58;

    - Извлечение подстрок с помощью срезов.

    ```go
    s := "Hello, Go!"
    substr := s[7:]
    fmt.Println(substr)  // Вывод: Go!
    ```

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

    - Для работы с символами Unicode.

    ```go
    s := "Hello, 世界"
    runes := []rune(s)
    fmt.Println(string(runes))  // Вывод: Hello, 世界
    ```

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

    - Использование операторов <code>&#61;&#61;</code> и <code>&#33;&#61;</code> для сравнения строк.

    ```go
    s1 := "Hello"
    s2 := "World"
    fmt.Println(s1 == s2)  // Вывод: false
    ```

1. <strong>Поиск подстроки</strong>&#58;

    - Использование функций из пакета <code>strings</code>.

    ```go
    import "strings"
    s := "Hello, Go!"
    contains := strings.Contains(s, "Go")
    fmt.Println(contains)  // Вывод: true
    ```

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

1. [Манипуляция со строками в Go](https://golangify.com/string)
   :::

---

## <strong>Что будет если сложить строки?</strong> [#q-14bee738d69b818ebd5ad18286f0c706]

При сложении (конкатенации) строк в Go создается новая строка, содержащая последовательность байтов из всех исходных строк. Исходные строки остаются неизменными.

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

```go
s1 := "Hello, "
s2 := "Go!"
result := s1 + s2
fmt.Println(result)  // Вывод: Hello, Go!
```

#### Что происходит&#58;

1. <strong>Выделение памяти</strong>&#58; Выделяется новая память для хранения
   объединенной строки.

1. <strong>Копирование байтов</strong>&#58; Байты из всех исходных строк
   копируются в новый участок памяти.

1. <strong>Создание новой строки</strong>&#58; Формируется новая строка,
   представляющая результат конкатенации.

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

1. [Манипуляция со строками в Go](https://golangify.com/string)
   :::

---

## <strong>Как определить количество символов для строки?</strong> [#q-14bee738d69b818fb9d7e2bc58762fd6]

Сначала уточните единицу подсчета&#58; len(s) считает байты, len(\[\]rune(s)) или utf8.RuneCountInString(s) — кодовые точки. Один видимый символ (графема), например эмодзи с модификатором, может состоять из нескольких кодовых точек.

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

```go
s := "Hello, hi"
runes := []rune(s)
length := len(runes)
fmt.Println(length)  // Вывод: 9
```

#### Объяснение&#58;

- <code>len&#40;s&#41;</code>&#58; Возвращает количество байтов в строке (не
  подходит для символов Unicode).

- \[\]rune(s)&#58; декодирует UTF-8 в кодовые точки. Некорректные последовательности заменяются на U+FFFD; одна руна не всегда равна одному видимому символу.

- len(runes)&#58; возвращает число кодовых точек после декодирования.

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

1. [Манипуляция со строками в Go](https://golangify.com/string)
   :::

---

## <strong>Какие есть нюансы при итерации по строке?</strong> [#q-14bee738d69b812fbc64dd253825ba0b]

Нюансы при итерации по строке в Go&#58;

{/* prettier-ignore */}
1. <strong>Итерация по байтам</strong>&#58;

    - Используя индекс, можно итерировать по байтам строки.

    - Пример&#58;

        ```go
        s := "Hello, hi"
        for i := 0; i < len(s); i++ {
            fmt.Printf("%c ", s[i])
        }
        // Вывод: H e l l o ,   hi
        ```

1. <strong>Итерация по рунам</strong>&#58;

    - Используя цикл <code>range</code>, можно итерировать по рунам (символам Unicode).

    - Пример&#58;

        ```go
        s := "Hello, hi"
        for _, r := range s {
            fmt.Printf("%c ", r)
        }
        // Вывод: H e l l o ,   hi
        ```

1. <strong>Индексы в цикле</strong> <code>range</code>&#58;

    - Цикл <code>range</code> возвращает индекс в байтах, а не в символах.

    - Пример&#58;

        ```go
        s := "Hello, 世界"
        for i, r := range s {
            fmt.Printf("Index: %d, Rune: %c\\n", i, r)
        }
        ```

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

1. [Манипуляция со строками в Go](https://golangify.com/string)
   :::

---

## <strong>Как эффективно склеивать строки (конкатенация строк)?</strong> [#q-14bee738d69b81979363ceb02b4964a5]

Для эффективной конкатенации строк используйте пакет <code>strings</code> и тип <code>strings&#46;Builder</code>.

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

```go
import (
    "strings"
    "fmt"
)

func main() {
    var sb strings.Builder

    sb.WriteString("Hello, ")
    sb.WriteString("World")
    sb.WriteString("!")

    result := sb.String()
    fmt.Println(result)  // Вывод: Hello, World!
}
```

#### Почему использовать <code>strings&#46;Builder</code>&#58;

1. <strong>Эффективность</strong>&#58; Минимизирует количество выделений памяти
   и копирований при конкатенации.

1. <strong>Простота</strong>&#58; Предоставляет удобные методы для построения
   строки.

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

1. [Манипуляция со строками в Go](https://golangify.com/string)
   :::
