Golang 反射牛刀小试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shida_csdn/article/details/88050459

一、引言

       在学习 Java 时,反射一直是个重点掌握内容,ORM 等框架的实现更是与反射息息相关;

       Go 语言同样提供了对反射的支持,json 序列化库就是基于反射来工作的;

       基于反射,我们不仅能够获得变量的类型信息,而且能够动态修改变量内部的字段值。

二、反射的使用

       我们就使用简单的代码,最快地验证下反射功能

package main

import (
	"reflect"
	"fmt"
)

type Student struct {
	Name string
	Age  int
}

func main() {
	student := Student{"xiaoming", 5}
	fmt.Println("Check origin value:")
	fmt.Println("\t", student)

	v := reflect.ValueOf(&student)
	t := v.Type() // 也可以使用 t := reflect.TypeOf(&student)

	// 打印 student 的所有属性名称和类型(获取属性信息)
	fmt.Println("Get fields:")
	for i := 0; i < t.Elem().NumField(); i++ {
		field := t.Elem().Field(i)
		fmt.Println("\t", field.Name, field.Type)
	}

	// 设置 age 为 10 (修改属性值)
	v.Elem().FieldByName("Age").SetInt(10)
	fmt.Println("Check new value:")
	fmt.Println("\t", student)

	// 将反射 Value 对象还原为原变量
	ss := v.Interface()
	fmt.Println("Change to origin variable:")
	fmt.Println("\t", ss)
}

       

         以上就是 go 反射的基本使用方法了!

         附上反射转换关系图一张:

         

猜你喜欢

转载自blog.csdn.net/shida_csdn/article/details/88050459