> For the complete documentation index, see [llms.txt](https://appsecurity.gitbook.io/devops/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://appsecurity.gitbook.io/devops/ppc/ppc-langs/backend/go/common/kollekcii/massivy-i-srezy.md).

# Массивы и срезы

Массивы в Go - последовательность элементов одного типа фиксированной длины

## Создание массива

```go
[длина]Тип
[N]Тип{значение1, значение2, ..., значениеN}
[...]Тип { значение1, значение2, ..., значениеN }  // ... - вычислить размер массива автоматически
```

## Создание среза

```go
make([]Тип, длина, емкость)
make([]Тип, длина)
[]Тип{}
[]Тип{значение1, значение2, ...}
```

На практике, всегда лучше создавать пустой срез через первый способ с непустой емкостью, примерно равной количеству ожидаемых элементов:&#x20;

```go
make([]Тип, 0, 10)
```

## Особенности

Массивы передаются по значению (можно, конечно, сделать указатель на массив), а срезы всегда по ссылке. Из массива всегда извлекается срез через операцию \[n:m]. Массивы имеют фиксированный размер, а срезы - переменный.

Все функции в стандартной библиотеке Go, образующие общедоступный API, используют срезы, а не массивы.

## Операции над срезами

### Добавление элементов и срезов

```go
s = append(s, "a", "b", "c")  // Добавить элементы a, b, c в срез s
s = append(s, t...)  // добавить все элементы среза t в срез s
s = append(s, t[2:5]...)  // добавить часть элементов из среза t в срез s
```

### Contains

Встроенной функции для массивов нет

```go
func Contains(target string, list []string) bool {
	for _, elem := range list {
		if elem == target {
			return true
		}
	}

	return false
}
```
