Тип reflect.Kind

Тип reflect.Kind представляет собой константу, которая определяет категорию типа данных в языке Go. Он используется в пакете reflect для идентификации базового типа значения во время выполнения программы. Тип reflect.Kind является перечислением, которое включает все возможные категории типов, такие как reflect.Int, reflect.String, reflect.Struct, reflect.Slice и другие.

Синтаксис

gotype Kind uint

Для получения значения reflect.Kind используется метод reflect.Value.Kind или метод reflect.Type.Kind. Оба метода возвращают константу типа reflect.Kind, которая позволяет определить категорию переданного значения.

Пример с типами int и string

Давайте определим категорию типов для целого числа и строки:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var num int = 42
  var str string = "hello"

  fmt.Println(reflect.TypeOf(num).Kind())
  fmt.Println(reflect.TypeOf(str).Kind())
}

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

go"int"
"string"

Пример с пользовательским типом

Давайте посмотрим, как reflect.Kind работает с пользовательским типом и структурой:

gopackage main

import (
  "fmt"
  "reflect"
)

type MyInt int
type Person struct {
  Name string
  Age  int
}

func main() {
  var myNum MyInt = 10
  var p Person

  fmt.Println(reflect.TypeOf(myNum).Kind())
  fmt.Println(reflect.TypeOf(p).Kind())
}

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

go"int"
"struct"

Пример с указателем и срезом

Давайте определим категорию типов для указателя и среза:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  var ptr *int
  var slice []int

  fmt.Println(reflect.TypeOf(ptr).Kind())
  fmt.Println(reflect.TypeOf(slice).Kind())
}

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

go"ptr"
"slice"

Пример с проверкой Kind в условном операторе

Давайте проверим категорию типа и выполним разные действия:

gopackage main

import (
  "fmt"
  "reflect"
)

func processValue(v interface{}) {
  val := reflect.ValueOf(v)
  switch val.Kind() {
  case reflect.Int:
    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() {
  processValue(42)
  processValue("hello")
  processValue([]int{1, 2, 3})
  processValue(true)
}

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

go"Integer: 42"
"String: hello"
"Slice length: 3"
"Other kind: bool"

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

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