# Информация по append в Go

`append` — одна из самых важных встроенных функций в Go для работы со слайсами. Ниже рассмотрены все возможные способы использования, примеры и пояснения.

---

## 🔧 Базовый синтаксис

```go
append(slice, elems...)
```

- `slice` — срез, к которому добавляем
- `elems...` — один или несколько элементов **или другой срез**

---

## ✅ Варианты использования

### 1. Добавить один элемент

```go
nums := []int{1, 2}
nums = append(nums, 3)
// → [1 2 3]
```

---

### 2. Добавить несколько элементов

```go
nums = append(nums, 4, 5, 6)
// → [1 2 3 4 5 6]
```

---

### 3. Добавить другой срез

```go
more := []int{7, 8}
nums = append(nums, more...) // обязательно `...`!
```

---

### 4. Добавить пустой срез

```go
nums = append(nums, []int{}...) // всё ещё [1 2 3 4 5 6 7 8]
```

---

### 5. Добавить к `nil`-срезу

```go
var s []int
s = append(s, 10) // работает, даже если s == nil
```

---

### 6. Удалить элемент (по индексу)

```go
i := 2
s = append(s[:i], s[i+1:]...)
```

---

## 📐 Как работает `append`

- Если у слайса **есть свободная capacity** — элементы просто добавляются.
- Если нет — Go **создаёт новый массив**, копирует старые значения и добавляет новые.
- Поэтому `append` может **изменить underlying array**.

---

## 🛠 Трюки с `append`

### 🔁 Объединение слайсов

```go
a := []string{"a", "b"}
b := []string{"c", "d"}
a = append(a, b...) // → [a b c d]
```

---

### 🪓 Удаление последнего элемента

```go
s = s[:len(s)-1]
```

---

## ⚠️ Важно помнить

- `append` **всегда возвращает новый слайс** (возможно тот же, возможно новый)
- Обязательно `...`, если добавляешь другой срез: `append(s, other...)`
- Работает **только со слайсами**, не с массивами

---

## 🧠 Сводка

<table id="bkmrk-%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80"><thead><tr><th id="bkmrk-%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">Использование</th><th id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80">Пример</th></tr></thead><tbody><tr><td>Один элемент</td><td>`append(s, 10)`</td></tr><tr><td>Несколько элементов</td><td>`append(s, 1, 2, 3)`</td></tr><tr><td>Добавить срез</td><td>`append(s, other...)`</td></tr><tr><td>Удалить элемент</td><td>`append(s[:i], s[i+1:]...)`</td></tr><tr><td>Работать с `nil`-срезом</td><td>`append(nil, 1)`</td></tr></tbody></table>