пятница, 11 января 2019 г.

Основы Go: создание среза с помощью make

Срезы могут быть созданы с помощью встроенной функции make; так можно создавать массивы с динамическим размером.

Функция make создает обнуленный массив и возвращает срез, который ссылается на этот массив.

a := make([]int, 5)  // len(a)=5

Чтобы указать вместимость, укажите третий аргумент к make:

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:

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]

Срезы срезов

Срезы могут содержать данные любого типа, в том числе и другие срезы.

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


Читайте также:


Комментариев нет:

Отправить комментарий