Метод reflect.Value.Kind
Метод reflect.Value.Kind возвращает базовый вид (kind) значения,
представленного объектом reflect.Value. В отличие от метода
Type, который возвращает полную информацию о типе,
Kind определяет только фундаментальную категорию значения,
такую как Int, String, Struct, Slice или
Ptr. Результат возвращается в виде константы типа
reflect.Kind.
Синтаксис
v.Kind() reflect.Kind
Пример
Давайте получим вид значения для различных типов данных:
package 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())
}
Результат выполнения кода:
int
string
slice
struct
Пример
Метод Kind позволяет отличить указатель от значения,
на которое он ссылается:
package 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())
}
Результат выполнения кода:
int
ptr
Пример
С помощью Kind можно построить гибкую логику обработки
значений разных типов в одной функции:
package 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)
}
Результат выполнения кода:
Integer: 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 корректное значение