Отражение. Это способность программы анализировать свою структуру во время выполнения. Или мы можем сказать, что это набор функций, которые используются для извлечения данных о переменной во время выполнения. Мы можем получить информацию о типе и значении во время выполнения. Он реализует отражение с помощью пакета Reflect, который предоставляет типы и методы для проверки частей структуры интерфейса и даже для изменения значений во время выполнения.

Сначала нам нужно импортировать пакет Reflect.

import "reflect"

Типы reflect.Type и reflect.Value предоставляют методы для доступа к частям интерфейса. Тип фокусируется на данных о типе, а значение фокусируется на данных о значении. Метод Kind фокусируется на представлении типа типа.

t := reflect.TypeOf(s)
v := reflect.ValueOf(s)
k := t.Kind()

Вот полный код для того же самого, взяв пример формы, прямоугольника и круга из предыдущей части (интерфейс).

package main

import (
   "fmt"
   "math"
   "reflect"
)

type Shape interface {
    area() float64
    perimeter() float64
}

type Rectangle struct {
    length, width float64
}

type Circle struct {
    radius float64
}

func (r Rectangle) area() float64 {
    return r.length * r.width
}

func (c Circle) area() float64 {
    return math.Pi * c.radius * c.radius
}

func (r Rectangle) perimeter() float64 {
    return 2 * (r.length + r.width)
}

func (c Circle) perimeter() float64 {
    return 2 * math.Pi * c.radius
}

func details(s Shape) {
   t := reflect.TypeOf(s)
   v := reflect.ValueOf(s)
   k := t.Kind()
   fmt.Println("type: ", t, " vlaue: ", v, " kind: ", k)
}

func main() {
   var s Shape
   s = Rectangle{length: 12.2, width: 8.7}
   details(s)
   s = Circle{radius: 2.4}
   details(s)
}

Выход

type: main.Rectangle vlaue: {12.2 8.7} kind: struct
type: main.Circle vlaue: {2.4} kind: struct