Lab 03: Unsafe & Reflect
Overview
Step 1: reflect.TypeOf and reflect.ValueOf
reflect.TypeOf and reflect.ValueOfpackage main
import (
"fmt"
"reflect"
)
type Point struct {
X, Y float64
}
func inspectValue(v interface{}) {
t := reflect.TypeOf(v)
val := reflect.ValueOf(v)
fmt.Printf("Type: %v\n", t)
fmt.Printf("Kind: %v\n", t.Kind())
fmt.Printf("Value: %v\n", val)
switch t.Kind() {
case reflect.Int, reflect.Int64:
fmt.Printf(" int value: %d\n", val.Int())
case reflect.String:
fmt.Printf(" string len: %d\n", val.Len())
case reflect.Struct:
fmt.Printf(" struct fields: %d\n", t.NumField())
case reflect.Slice:
fmt.Printf(" slice len: %d\n", val.Len())
}
}
func main() {
inspectValue(42)
inspectValue("hello")
inspectValue(Point{1.5, 2.5})
inspectValue([]int{1, 2, 3})
}Step 2: Struct Field Inspection and Tags
Step 3: reflect.Value.Set — Modify Struct Fields
reflect.Value.Set — Modify Struct FieldsStep 4: MethodByName — Dynamic Method Dispatch
MethodByName — Dynamic Method DispatchStep 5: reflect.MakeFunc — Dynamic Function Creation
reflect.MakeFunc — Dynamic Function CreationStep 6: unsafe.Pointer — Low-Level Memory
unsafe.Pointer — Low-Level MemoryStep 7: unsafe.Slice and unsafe.String (Go 1.17+)
unsafe.Slice and unsafe.String (Go 1.17+)Step 8: Capstone — JSON-like Marshaler via Reflection
Summary
Feature
Use Case
Risk
Last updated
