Метод reflect.Type.Kind
Метод reflect.Type.Kind возвращает категорию типа, к которой принадлежит переданное значение. Он возвращает константу типа reflect.Kind, которая представляет собой перечисление всех возможных видов типов в Go. В отличие от reflect.Type.Name, который возвращает имя пользовательского типа (например, "MyStruct"), метод Kind всегда возвращает базовый вид, на котором основан тип (например, struct для пользовательской структуры). Это полезно, когда нужно определить категорию типа для дальнейшей обработки, независимо от его конкретного имени.
Синтаксис
kind := t.Kind()
Метод не принимает параметров и возвращает значение типа reflect.Kind.
Пример
Рассмотрим базовый пример использования метода Kind для определения вида типа переменной:
package main
import (
"fmt"
"reflect"
)
func main() {
var num int = 42
t := reflect.TypeOf(num)
kind := t.Kind()
fmt.Println(kind)
}
Результат выполнения кода:
int
Пример
Сравним поведение методов Name и Kind для пользовательского типа:
package 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())
}
Результат выполнения кода:
Name: Person
Kind: struct
Обратите внимание: Name вернул имя типа "Person", а Kind указал, что это структура.
Пример
Продемонстрируем использование метода Kind для обработки различных типов данных в одной функции:
package 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
}
Результат выполнения кода:
Type: int, Kind: int
Type: string, Kind: string
Type: []int, Kind: slice
Type: struct { Name string }, Kind: struct
Пример
Используем метод Kind для проверки типа перед выполнением операции:
package 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)
}
Результат выполнения кода:
Integer value: 100
String value: abcde
Slice length: 5
Unsupported kind: bool
Смотрите также
-
функцию
reflect.TypeOf,
которая возвращает тип отражения для переданного значения -
метод
reflect.Value.Kind,
который возвращает вид значения -
тип
reflect.Kind,
который представляет собой перечисление всех возможных видов -
метод
reflect.Type.Name,
который возвращает имя типа