Skip to content

【1】代码:(熟知API)

go
package main

import(
        "fmt"
        "reflect"
)

//定义一个结构体:
type Student struct{
        Name string
        Age int
}

//给结构体绑定方法:
func (s Student) CPrint(){
        fmt.Println("调用了Print()方法")
        fmt.Println("学生的名字是:",s.Name)
}

func (s Student) AGetSum(n1,n2 int) int{
        fmt.Println("调用了AGetSum方法")
        return n1 + n2
}

func (s Student) BSet(name string,age int){
        s.Name = name
        s.Age = age
}

//定义函数操作结构体进行反射操作:
func TestStudentStruct(a interface{}){
        //a转成reflect.Value类型:
        val := reflect.ValueOf(a)
        fmt.Println(val)

        //通过reflect.Value类型操作结构体内部的字段:
        n1 := val.NumField()
        fmt.Println(n1)
        //遍历-获取具体的字段:
        for i := 0; i < n1;i++{
                fmt.Printf("第%d个字段的值是:%v",i,val.Field(i))
        }
        fmt.Println()

        //通过reflect.Value类型操作结构体内部的方法:
        n2 := val.NumMethod()
        fmt.Println(n2)

        //调用CPrint()方法:
        //调用方法,方法的首字母必须大写才能有对应的反射的访问权限
        //方法的顺序按照ASCII的顺序排列的,a,b,c,,,,,,索引:0,1,2,,,,,
        val.Method(2).Call(nil)

        //调用AGetSum方法:
        //定义Value的切片:
        var params []reflect.Value
        params = append(params,reflect.ValueOf(10))
        params = append(params,reflect.ValueOf(20))
        result := val.Method(0).Call(params)
        fmt.Println("AGetSum方法的返回值为:",result[0].Int())
}

func main(){
        //定义结构体具体的实例:
        s := Student{
                Name : "丽丽",
                Age : 18,
        }

        //调用TestStudentStruct:
        TestStudentStruct(s)
}

Java · Golang · Rust