Метод reflect.Value.Len

Метод reflect.Value.Len возвращает длину значения, хранящегося в reflect.Value. Он работает с массивами, срезами, картами, каналами и строками. Если значение не является одним из перечисленных типов, метод вызывает панику. Метод не принимает никаких параметров и возвращает целое число типа int.

Синтаксис

gofunc (v Value) Len() int

Пример для среза

Получим длину среза строк с помощью метода reflect.Value.Len:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  slice := []string{"a", "b", "c", "d", "e"}
  v := reflect.ValueOf(slice)
  length := v.Len()
  fmt.Println(length)
}

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

go5

Пример для массива

Метод также работает с массивами. Получим длину массива целых чисел:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  arr := [5]int{1, 2, 3, 4, 5}
  v := reflect.ValueOf(arr)
  length := v.Len()
  fmt.Println(length)
}

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

go5

Пример для карты

Для карт метод возвращает количество ключей. Получим длину карты:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  m := map[string]int{
    "a": 1,
    "b": 2,
    "c": 3,
  }
  v := reflect.ValueOf(m)
  length := v.Len()
  fmt.Println(length)
}

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

go3

Пример для канала

Для каналов метод возвращает количество элементов, ожидающих в буфере. Получим длину буферизированного канала:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  ch := make(chan int, 3)
  ch <- 1
  ch <- 2
  v := reflect.ValueOf(ch)
  length := v.Len()
  fmt.Println(length)
}

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

go2

Пример для строки

Для строк метод возвращает количество байт (не рун). Получим длину строки:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  str := "abcde"
  v := reflect.ValueOf(str)
  length := v.Len()
  fmt.Println(length)
}

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

go5

Пример с паникой

Если вызвать метод на значении неподходящего типа, произойдет паника. Например, попробуем получить длину числа:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  num := 42
  v := reflect.ValueOf(num)
  defer func() {
    if r := recover(); r != nil {
      fmt.Println("Panic:", r)
    }
  }()
  length := v.Len()
  fmt.Println(length)
}

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

go"Panic: reflect: call of reflect.Value.Len on int Value"

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

  • метод reflect.Value.Cap,
    который возвращает емкость отраженного значения
  • функцию reflect.Type.Len,
    которая возвращает длину типа
  • функцию reflect.Value.Index,
    которая получает элемент по индексу
  • функцию reflect.Value.IsNil,
    которая проверяет, является ли значение нулевым