Константа reflect.Interface

Константа reflect.Interface представляет собой значение перечисления reflect.Kind, которое соответствует типу интерфейса в Go. Она используется в пакете reflect для определения, является ли тип или значение интерфейсом. Константа имеет тип reflect.Kind и используется в основном для сравнения с результатом методов reflect.Type.Kind или reflect.Value.Kind.

В Go интерфейсы представляют собой абстрактные типы, которые определяют набор методов. В рефлексии константа reflect.Interface позволяет идентифицировать значения, которые являются интерфейсами, и работать с ними соответствующим образом.

Синтаксис

goreflect.Interface

Константа используется в сочетании с методами reflect.Value.Kind или reflect.Type.Kind для проверки типа интерфейса.

Пример

Давайте проверим, является ли переменная типа interface{} интерфейсом с помощью константы reflect.Interface:

gopackage 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)
}

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

go"Kind of a: int"
"Is a interface? false"
"Kind of b: int"
"Is b interface? false"

Пример

Рассмотрим пример с переменной, которая хранит интерфейс, и переменной, хранящей конкретный тип, реализующий интерфейс:

gopackage 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)
}

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

go"Kind of iface: interface"
"Is iface interface? true"
"Kind of concrete: int"
"Is concrete interface? false"

Пример

Используем константу reflect.Interface вместе с методом reflect.Type.Kind для проверки типа интерфейса:

gopackage 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)
}

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

go"Kind of Reader: interface"
"Is Reader interface? true"
"Kind of string: string"
"Is string interface? false"

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

  • константу reflect.Invalid,
    которая представляет недействительный тип в рефлексии
  • константу reflect.Bool,
    которая представляет булевый тип в рефлексии
  • константу reflect.Int,
    которая представляет целочисленный тип в рефлексии
  • константу reflect.String,
    которая представляет строковый тип в рефлексии