Метод reflect.Value.Cap

Метод reflect.Value.Cap возвращает ёмкость составного типа, представленного значением reflect.Value. Он работает с типами slice, array и chan. Если значение не является одним из этих типов, метод вызывает панику.

Синтаксис

gofunc (v Value) Cap() int

Пример работы с массивом

Давайте получим ёмкость массива из 5 элементов:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  arr := [5]int{1, 2, 3, 4, 5}
  val := reflect.ValueOf(arr)
  res := val.Cap()
  fmt.Println(res)
}

Результат выполнения кода:

go5

Пример работы со слайсом

Давайте создадим слайс с ёмкостью 10 и получим её значение:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  sl := make([]string, 0, 10)
  val := reflect.ValueOf(sl)
  res := val.Cap()
  fmt.Println(res)
}

Результат выполнения кода:

go10

Пример работы с каналом

Давайте получим ёмкость буферизированного канала:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  ch := make(chan int, 20)
  val := reflect.ValueOf(ch)
  res := val.Cap()
  fmt.Println(res)
}

Результат выполнения кода:

go20

Пример сравнения Len и Cap

Давайте сравним длину и ёмкость слайса после добавления элементов:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  sl := make([]int, 3, 5)
  sl = append(sl, 4, 5, 6)
  val := reflect.ValueOf(sl)
  length := val.Len()
  capacity := val.Cap()
  fmt.Printf("Len: %d, Cap: %d", length, capacity)
}

Результат выполнения кода:

goLen: 6, Cap: 10

Смотрите также

  • метод reflect.Value.Len,
    который возвращает длину составного типа
  • тип reflect.Value,
    представляющий отражённое значение Go-переменной
  • функцию reflect.ValueOf,
    которая создаёт значение reflect.Value из интерфейса
  • тип reflect.Kind,
    который определяет конкретный вид типа данных