2019-10-05 16:12:52 +03:00

81 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// _Срезы_ являются ключевым типом данных в Go,
// предоставляя более мощный интерфейс для последовательностей,
// чем массивы.
package main
import "fmt"
func main() {
// В отличии от массивов, длина среза зависит от содержащихся
// в срезе элементов, а не определена при инициализации.
// Создать пустой срез в ненулевой длиной можно используя
// оператор `make`. В этом пример мы создаем слайс строк
// длиной 3 (заполненный нулевыми значениями).
s := make([]string, 3)
fmt.Println("emp:", s)
// Мы можем устанавливать и получать значения, как в массивах.
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("set:", s)
fmt.Println("get:", s[2])
// `len` возвращает длину среза, как и ожидалось.
fmt.Println("len:", len(s))
// В дополнение к базовой функциональности, срезы
// имеют несколько дополнительных особенностей
// по сравнению с массивыми. Одна из них - `append`,
// которая возвращает срезу содержащий одно или более
// новых значений. Обратите внимание, что результат
// функции `append` необходимо присвоить в переменную,
// т.к. это уже будет новый срез.
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println("apd:", s)
// Срезы могут быть скопированы с помощью `copy`. В
// данном примере мы создаем пустой срез `c` такой же
// длины как и `s` и копируем данные из `s` в `c`.
c := make([]string, len(s))
copy(c, s)
fmt.Println("cpy:", c)
// Срезы поддерживают оператор `slice` (синтаксис
// использование `slice[low:high]`). Для примера,
// тут мы получаем срез состоящий из элементов
// `s[2]`, `s[3]`, и `s[4]`.
l := s[2:5]
fmt.Println("sl1:", l)
// Тут мы получаем срез до элемента `s[5]` (исключая его).
l = s[:5]
fmt.Println("sl2:", l)
// А тут получаем срез от `s[2]` (включая его) и до конца
// исходного среза.
l = s[2:]
fmt.Println("sl3:", l)
// Мы можем объявить и заполнить срез значениями в одну
// строку.
t := []string{"g", "h", "i"}
fmt.Println("dcl:", t)
// Срезы можно объединять в многомерные структуры
// данных. Длина внутренних срезов может варьироваться,
// в отличии от многомерных массивов.
twoD := make([][]int, 3)
for i := 0; i < 3; i++ {
innerLen := i + 1
twoD[i] = make([]int, innerLen)
for j := 0; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}