Константа reflect.Interface
Константа reflect.Interface представляет собой значение перечисления reflect.Kind,
которое соответствует типу интерфейса в Go. Она используется в пакете reflect
для определения, является ли тип или значение интерфейсом. Константа имеет тип
reflect.Kind и используется в основном для сравнения с результатом методов
reflect.Type.Kind или reflect.Value.Kind.
В Go интерфейсы представляют собой абстрактные типы, которые определяют набор методов.
В рефлексии константа reflect.Interface позволяет идентифицировать значения,
которые являются интерфейсами, и работать с ними соответствующим образом.
Синтаксис
reflect.Interface
Константа используется в сочетании с методами reflect.Value.Kind или
reflect.Type.Kind для проверки типа интерфейса.
Пример
Давайте проверим, является ли переменная типа interface{} интерфейсом
с помощью константы reflect.Interface:
package main
import (
"fmt"
"reflect"
)
func main() {
var a interface{} = 42
var b int = 100
fmt.Println("Kind of a:", reflect.ValueOf(a).Kind())
fmt.Println("Is a interface?", reflect.ValueOf(a).Kind() == reflect.Interface)
fmt.Println("Kind of b:", reflect.ValueOf(b).Kind())
fmt.Println("Is b interface?", reflect.ValueOf(b).Kind() == reflect.Interface)
}
Результат выполнения кода:
"Kind of a: int"
"Is a interface? false"
"Kind of b: int"
"Is b interface? false"
Пример
Рассмотрим пример с переменной, которая хранит интерфейс, и переменной, хранящей конкретный тип, реализующий интерфейс:
package main
import (
"fmt"
"reflect"
)
type MyStringer interface {
String() string
}
type MyInt int
func (m MyInt) String() string {
return fmt.Sprintf("MyInt: %d", m)
}
func main() {
var iface MyStringer = MyInt(42)
var concrete MyInt = 100
fmt.Println("Kind of iface:", reflect.ValueOf(iface).Kind())
fmt.Println("Is iface interface?", reflect.ValueOf(iface).Kind() == reflect.Interface)
fmt.Println("Kind of concrete:", reflect.ValueOf(concrete).Kind())
fmt.Println("Is concrete interface?", reflect.ValueOf(concrete).Kind() == reflect.Interface)
}
Результат выполнения кода:
"Kind of iface: interface"
"Is iface interface? true"
"Kind of concrete: int"
"Is concrete interface? false"
Пример
Используем константу reflect.Interface вместе с методом
reflect.Type.Kind для проверки типа интерфейса:
package main
import (
"fmt"
"reflect"
)
type Reader interface {
Read(p []byte) (n int, err error)
}
func main() {
var r Reader
t := reflect.TypeOf(r)
fmt.Println("Kind of Reader:", t.Kind())
fmt.Println("Is Reader interface?", t.Kind() == reflect.Interface)
var s string
ts := reflect.TypeOf(s)
fmt.Println("Kind of string:", ts.Kind())
fmt.Println("Is string interface?", ts.Kind() == reflect.Interface)
}
Результат выполнения кода:
"Kind of Reader: interface"
"Is Reader interface? true"
"Kind of string: string"
"Is string interface? false"
Смотрите также
-
константу
reflect.Invalid,
которая представляет недействительный тип в рефлексии -
константу
reflect.Bool,
которая представляет булевый тип в рефлексии -
константу
reflect.Int,
которая представляет целочисленный тип в рефлексии -
константу
reflect.String,
которая представляет строковый тип в рефлексии