package main
import (
"fmt"
"reflect"
)
// 1. reflect 获取变量的类型、值
func reflectFn(x interface{}) {
v := reflect.TypeOf(x)
v1 := reflect.ValueOf(x)
fmt.Println(v, v1, v.Name(), v.Kind())
}
func f1() {
type myInt int
type Person struct {
Name string
Age int
}
var x myInt = 34
var p = Person{
Name: "张三",
Age: 20,
}
y := "hello"
arr := [3]int{1, 2, 3}
sli := []int{4, 5, 6}
reflectFn(3) // int 3 int int
reflectFn(3.14) // float64 3.14 float64 float64
reflectFn(true) // bool true bool bool
reflectFn("golang") // string golang string string
reflectFn(x) // main.myInt 34 myInt int
reflectFn(p) // main.Person {张三 20} Person struct
reflectFn(&y) // *string 0xc000046230 ptr
reflectFn(arr) // [3]int [1 2 3] array
reflectFn(sli) // []int [4 5 6] slice
}
// 2. reflect 修改变量的值
func reflectFn1(x interface{}) {
v := reflect.ValueOf(x)
if v.Elem().Kind() == reflect.String {
v.Elem().SetString("world")
}
}
func f2() {
x := "hello"
reflectFn1(&x)
fmt.Println("修改后:", x) // 修改后: world
}
func main() {
f2()
}