Go Slices: Практическое руководство

Beginner

This tutorial is from open-source community. Access the source code

Введение

Лаборатория Slices предназначена для проверки ваших знаний о типе данных среза в Go. Срезы представляют собой более мощный интерфейс к последовательностям, чем массивы, и эта лаборатория поможет вам понять, как их использовать.

Срезы

Задача, которую необходимо решить в этой лаборатории, - создать и манипулировать срезами в Go. Вам понадобится создать пустой срез с ненулевой длиной, задавать и получать значения в срезе, использовать функцию len для получения длины среза, функцию append для добавления новых значений в срез, функцию copy для копирования среза и оператор среза для получения среза элементов из существующего среза.

Для завершения этой лаборатории вам необходимо иметь базовое понимание синтаксиса Go и типа данных среза. Также вам понадобится быть знакомым с функциями make, append и copy, а также оператором среза.

## Обратите внимание, что хотя срезы имеют другой тип, чем массивы,
## они выводятся аналогично с использованием `fmt.Println`.
$ go run slices.go
emp: [ ]
set: [a b c]
get: c
len: 3
apd: [a b c d e f]
cpy: [a b c d e f]
sl1: [c d e]
sl2: [a b c d e]
sl3: [c d e f]
dcl: [g h i]
2d: [[0] [1 2] [2 3 4]]

## Посетите этот [отличный блог-пост](https://go.dev/blog/slices-intro)
## от команды Go для получения более подробной информации о
## дизайне и реализации срезов в Go.

## Теперь, когда мы рассмотрели массивы и срезы, мы посмотрим на
## другую важную встроенную структуру данных Go: карты.

Ниже представлен полный код:

// _Срезы_ - важный тип данных в Go, предоставляющий
// более мощный интерфейс к последовательностям, чем массивы.

package main

import "fmt"

func main() {

    // В отличие от массивов, срезы типизируются только
    // элементами, которые они содержат (а не количеством элементов).
    // Чтобы создать пустой срез с ненулевой длиной, используйте
    // встроенную функцию `make`. Здесь мы создаем срез
    // из `string` длиной `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)

    // Срезы также можно `копировать`. Здесь мы создаем пустой
    // срез `c` той же длины, что и `s`, и копируем в `c` из `s`.
    c := make([]string, len(s))
    copy(c, s)
    fmt.Println("cpy:", c)

    // Срезы поддерживают оператор "среза" со следующей синтаксисом:
    // `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)
}

Резюме

Лаборатория Slices предназначена для проверки ваших знаний о типе данных среза в Go. Завершив эту лабораторию, вы лучше поймете, как создавать и манипулировать срезами в Go, включая то, как задавать и получать значения в срезе, использовать функцию len, функции append и copy и оператор среза.