反射:可以在运行时动态获取变量的相关信息
Import (“reflect”)
两个函数:
a. reflect.TypeOf,获取变量的类型,返回reflect.Type类型
b. reflect.ValueOf,获取变量的值,返回reflect.Value类型
c. reflect.Value.Kind,获取变量的类别,返回一个常量
d. reflect.Value.Interface(),转换成interface{}类型
反射

reflect.Value.Kind()方法返回的常量:
const (
Invalid Kind = iota
Bool
Int
Int8
Int16
Int32
Int64
Uint
Uint8
Uint16
Uint32
Uint64
Uintptr
Float32
Float64
Complex64
Complex128
Array
Chan
Func
Interface
Map
Ptr
Slice
String
Struct
UnsafePointer
)
获取变量的值:
reflect.ValueOf(x).Float()
reflect.ValueOf(x).Int()
reflect.ValueOf(x).String()
reflect.ValueOf(x).Bool()
通过反射的来改变变量的值:
reflect.Value.SetXX相关方法,比如:
reflect.Value.SetFloat(),设置浮点数
reflect.Value.SetInt(),设置整数
reflect.Value.SetString(),设置字符串

package main

import (
    "reflect"
    "fmt"
)

type Student struct {
    Name string
    Age int
    Score float32
}

func test(b interface{}) {
    t := reflect.TypeOf(b)
    fmt.Println(t)

    v := reflect.ValueOf(b)
    k := v.Kind()
    fmt.Println(k)

    iv := v.Interface()
    fmt.Println("iv:",iv)
    stu, ok := iv.(Student)
    if ok {
        fmt.Printf("stu: %v %T\n", stu, stu)
    }
}

func main() {
    var a int = 200
    test(a)

    fmt.Println("
") var b Student = Student{ Name: "stu01", Age: 18, Score: 92, } test(b) }

输出:
int
int
iv: 200


main.Student
struct
iv: {stu01 18 92}
stu: {stu01 18 92} main.Student

Process finished with exit code 0