Метод reflect.Type.Kind

Метод reflect.Type.Kind возвращает категорию типа, к которой принадлежит переданное значение. Он возвращает константу типа reflect.Kind, которая представляет собой перечисление всех возможных видов типов в Go. В отличие от reflect.Type.Name, который возвращает имя пользовательского типа (например, "MyStruct"), метод Kind всегда возвращает базовый вид, на котором основан тип (например, struct для пользовательской структуры). Это полезно, когда нужно определить категорию типа для дальнейшей обработки, независимо от его конкретного имени.

Синтаксис

gokind := t.Kind()

Метод не принимает параметров и возвращает значение типа reflect.Kind.

Пример

Рассмотрим базовый пример использования метода Kind для определения вида типа переменной:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var num int = 42
  t := reflect.TypeOf(num)
  kind := t.Kind()
  fmt.Println(kind)
}

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

goint

Пример

Сравним поведение методов Name и Kind для пользовательского типа:

gopackage main

import (
  "fmt"
  "reflect"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  var p Person
  t := reflect.TypeOf(p)
  fmt.Println("Name:", t.Name())
  fmt.Println("Kind:", t.Kind())
}

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

goName: Person
Kind: struct

Обратите внимание: Name вернул имя типа "Person", а Kind указал, что это структура.

Пример

Продемонстрируем использование метода Kind для обработки различных типов данных в одной функции:

gopackage main

import (
  "fmt"
  "reflect"
)

func printKind(x interface{}) {
  t := reflect.TypeOf(x)
  fmt.Printf("Type: %v, Kind: %v\n", t, t.Kind())
}

func main() {
  printKind(123)         // int
  printKind("hello")       // string
  printKind([]int{1, 2, 3})    // slice
  printKind(struct{ Name string }{Name: "John"}) // struct
}

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

goType: int, Kind: int
Type: string, Kind: string
Type: []int, Kind: slice
Type: struct { Name string }, Kind: struct

Пример

Используем метод Kind для проверки типа перед выполнением операции:

gopackage main

import (
  "fmt"
  "reflect"
)

func processValue(v interface{}) {
  val := reflect.ValueOf(v)
  switch val.Kind() {
  case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    fmt.Println("Integer value:", val.Int())
  case reflect.String:
    fmt.Println("String value:", val.String())
  case reflect.Slice:
    fmt.Println("Slice length:", val.Len())
  default:
    fmt.Println("Unsupported kind:", val.Kind())
  }
}

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

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

goInteger value: 100
String value: abcde
Slice length: 5
Unsupported kind: bool

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

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