การสะท้อนกลับ: เป็นความสามารถของโปรแกรมในการทบทวนและวิเคราะห์โครงสร้างระหว่างรันไทม์ หรืออาจกล่าวได้ว่ามันคือชุดของฟังก์ชันที่ใช้ในการดึงข้อมูลเกี่ยวกับตัวแปรระหว่างรันไทม์ เราสามารถรับข้อมูลประเภทและค่าระหว่างรันไทม์ได้ มันใช้การสะท้อนกลับด้วยแพ็คเกจการสะท้อนซึ่งมีประเภทและวิธีการตรวจสอบส่วนของโครงสร้างอินเทอร์เฟซและแม้แต่การแก้ไขค่าที่รันไทม์

ก่อนอื่นเราต้องนำเข้าแพ็คเกจการสะท้อนกลับ

import "reflect"

ประเภท reflect.Type และ reflect.Value มีวิธีการเข้าถึงส่วนต่างๆ ของอินเทอร์เฟซ Type เน้นที่ข้อมูลเกี่ยวกับประเภทและค่า เน้นที่ข้อมูลเกี่ยวกับค่า วิธีการ 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