Срезы могут быть созданы с помощью встроенной функции make; так можно создавать массивы с динамическим размером.
Функция make создает обнуленный массив и возвращает срез, который ссылается на этот массив.
1
|
a := make([]int, 5) // len(a)=5 |
Чтобы указать вместимость, укажите третий аргумент к make:
1 2 3 4 |
b := make([]int, 0, 5) // len(b)=0, cap(b)=5 b = b[:cap(b)] // len(b)=5, cap(b)=5 b = b[1:] // len(b)=4, cap(b)=4 |
Пример использования make:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
package main import "fmt" func main() { a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[:2] printSlice("c", c) d := c[2:5] printSlice("d", d) } func printSlice(s string, x []int) { fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x) } |
Вывод:
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0]
d len=3 cap=3 [0 0 0]
Срезы срезов
Срезы могут содержать данные любого типа, в том числе и другие срезы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package main import ( "fmt" "strings" ) func main() { // Создаем доску для крестиков-ноликов. board := [][]string{ []string{"_", "_", "_"}, []string{"_", "_", "_"}, []string{"_", "_", "_"}, } // Игроки делают ходы. board[0][0] = "X" board[2][2] = "O" board[1][2] = "X" board[1][0] = "O" board[0][2] = "X" for i := 0; i < len(board); i++ { fmt.Printf("%s\n", strings.Join(board[i], " ")) } } |
Вывод:
X _ X
O _ X
_ _ O
На хабре почти год назад видел статью – полное руководство по массивам и срезам в Golang. Зайди, почитай, она на русском языке, так что всё должно быть понятно.
Советую зайти на сайт golangs.org, там есть уроки по голангу соответственно, и там ты найдёшь урок – Срез массива в Golang. На этом сайте всё на русском языке, так что должно быть всё тип-топ.
Спасибо большое за объяснения, реальный код и небольшую теорию. Буду сейчас со всем этим ознакамливаться и наконец-таки начну использовать в своём коде.