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