Метод reflect.Value.Kind

Метод reflect.Value.Kind возвращает базовый вид (kind) значения, представленного объектом reflect.Value. В отличие от метода Type, который возвращает полную информацию о типе, Kind определяет только фундаментальную категорию значения, такую как Int, String, Struct, Slice или Ptr. Результат возвращается в виде константы типа reflect.Kind.

Синтаксис

gov.Kind() reflect.Kind

Пример

Давайте получим вид значения для различных типов данных:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var (
    num   int   = 10
    str   string  = "abcde"
    sl  []int   = []int{1, 2, 3, 4, 5}
    person struct{ Name string }
  )

  fmt.Println(reflect.ValueOf(num).Kind())
  fmt.Println(reflect.ValueOf(str).Kind())
  fmt.Println(reflect.ValueOf(sl).Kind())
  fmt.Println(reflect.ValueOf(person).Kind())
}

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

goint
string
slice
struct

Пример

Метод Kind позволяет отличить указатель от значения, на которое он ссылается:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  num := 42
  ptr := &num

  v1 := reflect.ValueOf(num)
  v2 := reflect.ValueOf(ptr)

  fmt.Println(v1.Kind())
  fmt.Println(v2.Kind())
}

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

goint
ptr

Пример

С помощью Kind можно построить гибкую логику обработки значений разных типов в одной функции:

gopackage main

import (
  "fmt"
  "reflect"
)

func inspect(v interface{}) {
  val := reflect.ValueOf(v)
  switch val.Kind() {
  case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    fmt.Printf("Integer: %d\n", val.Int())
  case reflect.String:
    fmt.Printf("String: %s\n", val.String())
  case reflect.Slice:
    fmt.Printf("Slice length: %d\n", val.Len())
  default:
    fmt.Printf("Other kind: %s\n", val.Kind())
  }
}

func main() {
  inspect(100)
  inspect("abcde")
  inspect([]int{1, 2, 3, 4, 5})
  inspect(3.14)
}

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

goInteger: 100
String: abcde
Slice length: 5
Other kind: float64

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

  • метод reflect.Value.Type,
    который возвращает полную информацию о типе значения
  • метод reflect.Type.Kind,
    который получает вид значения из типа без создания экземпляра
  • метод reflect.Value.Interface,
    который извлекает исходное значение из reflect.Value
  • метод reflect.Value.IsValid,
    который проверяет, содержит ли reflect.Value корректное значение