golang reflect包实现了反射 。动态的获得程序运行时对象的结构和信息 。
reflect 包中提供了两个基础的关于反射的函数来获取上述的接口和结构体:
func TypeOf(i interface{}) Type
func ValueOf(i interface{}) Value
大体上可以这样理解 , TypeOf获取对象的类型信息,ValueOf获取对象中存储的值 。
golang tag
golang中可以为结构体的字段添加tag 。golang本身的encoding/json包解析json使用了tag,一些开源的orm框架如gorm,也使用了tag 。tag可以方便的为结构体的字段添加一些信息,用reflect可以读取到,加以利用 。
这是一个用tag标记列名以实现结构体自动生成xlsx的例子:
```
type Employee struct{
ID int `xlsx:”工号”`
Name string `xlsx:”姓名”`
Email string `xlsx:”邮箱”`
}
func Outputxlsx(es []*Employee) ([]byte, error) {
xt := reflect.TypeOf(es[0])
xv := reflect.ValueOf(es[0])
rows := [][]interface{}{}
headers := []interface{}{}
for i := 0; ixt.Elem().NumField(); i++ {
head, ok := xt.Elem().Field(i).Tag.Lookup("xlsx")
if ok {
headers = append(headers, head)
}
}
for _, e := range es {
cells := []interface{}{}
xv := reflect.ValueOf(e)
for i := 0; ixv.Elem().NumField(); i++ {
_, ok := xt.Elem().Field(i).Tag.Lookup("xlsx")
if ok {
cells = append(cells, xv.Elem().Field(i).Interface())
}
}
rows = append(rows, cells)
}
file := xlsx.NewFile()
sheet, _ := file.AddSheet("sheet1")
row := sheet.AddRow()
for _, header := range headers {
row.AddCell().Value = https://www.04ip.com/post/fmt.Sprintf("%v", header)
}
for _, v := range rows {
row := sheet.AddRow()
for _, vv := range v {
row.AddCell().Value = https://www.04ip.com/post/fmt.Sprintf("%v", vv)
}
}
var buffer bytes.Buffer
if err := file.Write(buffer); err != nil {
return nil, err
}
return buffer.Bytes(), nil
}
```
go语言中的反射import (
"fmt"
"reflect"
)
func reflecType(x interface{}){
v := reflect.TypeOf(x)
fmt.Println("type:%v\n", v)
fmt.Println("type name:%v , rtpe kind:%v \n", v.getName(), v.getType())
}
type Cat struct{}
//通过反射设置变量的值
func reflectSetValue1(x interface{}){
v := reflect.ValueOf(x)
if v.Kind() == reflect.Int64{
v.SetInt(200) //修改的是副本, reflect 包会引发panic
}
}
//通过反射设置变量的值
func reflectSetValue2(x interface{}){
v := reflect.ValueOf(x)
//反射中使用Elem()获取指针对应的值
if v.Elem().Kind() == reflect.Int64{
v.Elem().SetInt(200)
}
}
func main(){
var a float32 = 3.14
reflectType(a) //type name:float32 type kind:float32
var b int64 = 100
reflectType(b) // type name :int64 type kind :int64
var c = Cat{}
reflectType(c) // type name :Cat type kind :struct
reflectSetValue1(b)
fmt.Println(b) //依然为100
reflectSetValue2(b)
}
【go语言反射改属性的值 golang反射底层实现原理】go语言反射改属性的值的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于golang反射底层实现原理、go语言反射改属性的值的信息别忘了在本站进行查找喔 。
推荐阅读
- 财务电脑怎么升级硬盘,如何升级电脑硬盘
- pg数据库左连接查询,连接pg数据库命令
- 传动作游戏作文,传动游戏及玩法
- sqlserver2008官方,sqlserver2008下载网址
- mysql怎么清除碎片 彻底清除mysql
- gis巡视是什么意思,gis设备巡视检查项目
- 电脑怎么操作换行,电脑怎么操作换行符号
- 笔记本显卡硅脂怎么擦出来,笔记本显卡硅脂垫好还是硅脂好
- php麒麟数据采集 麒麟数据分析