Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  C语言  >  正文 golang标准库reflect包实现操作任意类型对象

golang标准库reflect包实现操作任意类型对象

发布时间:2017-12-13   编辑:www.jquerycn.cn
jquery中文网为您提供golang标准库reflect包实现操作任意类型对象等资源,欢迎您收藏本站,我们将为您提供最新的golang标准库reflect包实现操作任意类型对象资源
本文章来为各位介绍一篇关于golang标准库reflect包实现操作任意类型对象的例子,希望此例子能够对各位带来帮助。

空接口interface{},reflect配合空接口,让原本是静态类型的go具备了很多动态类型语言的特征。
func TypeOf(i interface{}) Type

TypeOf返回接口中保存的值的类型,TypeOf(nil)会返回nil。

func ValueOf(i interface{}) Value

ValueOf返回一个初始化为i接口保管的具体值的Value,ValueOf(nil)返回Value零值。

func (v Value) NumField() int

返回v持有的结构体类型值的字段数,如果v的Kind不是Struct会panic
 

利用reflect反射出所有struct字段和方法:
package main
 
import (
 "fmt"
 "reflect"
)
 
type User struct {
 Name string
 Age  int
 Id   string
}
 
func (u User)sayHello() {
 fmt.Println("hello!")
}
 
func main() {
 u := User{Name:"mckee", Age:20, Id:"user100"};
 
 t := reflect.TypeOf(u)
 fmt.Println(t) //main.User
 fmt.Println(t.Name()) //User
 fmt.Println(t.NumField()) //3
 fmt.Println(t.Kind()) //struct
 
 //检测类型
 if k := t.Kind(); k != reflect.Struct {
  return
 }
 
 //输出所有的属性,结果如下:
 /*
 Name string mckee
 Age int 20
 Id string user100
  */
 v := reflect.ValueOf(u)
 for i := 0; i < t.NumField(); i   {
  fieldType := t.Field(i)
  fmt.Println(fieldType.Name, fieldType.Type, v.Field(i).Interface())
 }
 
 //输出所有方法
 for i := 0; i < t.NumMethod(); i {
  m := t.Method(i)
  fmt.Println(m.Name, m.Type) //sayHello func(main.User)
 }
}

利用reflect动态调用方法:

package main
 
import (
 "fmt"
 "reflect"
)
 
type User struct {
 Name string
 Age  int
 Id   string
}
 
func (u User)SayHello(name string) {
 fmt.Println("hello, ", name, "! my name is ", u.Name)
}
 
func main() {
 u := User{Name:"mckee", Age:20, Id:"user100"};
 
 //hello,  Jack ! my name is  mckee
 reflect.ValueOf(u).MethodByName("SayHello").Call([]reflect.Value{reflect.ValueOf("Jack")})
}

您可能感兴趣的文章:
golang标准库reflect包实现操作任意类型对象
Go语言学习之reflect包(The way to go)
golang 结构体断言_Golang中的reflect原理
用CSS3实现图片倒影教程
golang的反射机制与实践(上)
golang 面试题(十三)interface内部结构和nil详解
基于类型系统的面向对象编程语言Go
golang和python有什么区别?
Go:06---语言数据类型整体介绍、数据类型检查(reflect包)、数据类型转换
golang 动态生成函数_GoLang的优点和缺点

[关闭]