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")})
}

时间: 2024-08-17 14:16:47

golang标准库reflect包实现操作任意类型对象的相关文章

golang标准库flag包实现实现命令行解析

golang中flag包是用来对命令行参数解析的,看下面一个简单例子: package main   import (  "fmt"  "flag" )   func main() {    //使用flag.String()函数注册flag,得到结果conf指针  var conf = flag.String("f", "test.conf", "Specify the config file")    

Python标准库04 文件管理 (部分os包,shutil包)

原文:Python标准库04 文件管理 (部分os包,shutil包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   在操作系统下,用户可以通过操作系统的命令来管理文件,参考linux文件管理相关命令.Python标准库则允许我们从Python内部管理文件.相同的目的,我们有了两条途径.尽管在Python调用标准库的方式不如操作系统命令直接,但有它自己的优势.你可以利用Python语言,并发挥其他Python工具,形成组

深入解析Go语言的io.ioutil标准库使用_Golang

今天我们讲解的是golang标准库里边的io/ioutil包–也就是package io/ioutil 1.ioutil.ReadDir(dirname string)这个函数的原型是这样的 func ReadDir(dirname string) ([]os.FileInfo, error) 不难看出输入的是dirname类型是string类型的 譬如"d:/go",然会是一个FileInfo的切片,其中FileInfo的结构是这样的 复制代码 代码如下:   type FileIn

linux系统编程基础(四) C标准库IO缓冲区和内核缓冲区的区别

1.C标准库的I/O缓冲区 UNIX的传统 是Everything is a file,键盘.显示器.串口.磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也可以像普通文件(保存在磁盘上的文件)一样打开.读.写和关闭,使用的函数接口是相同的.用户程序调用C标准I/O库函数读写普通文件或设备,而这些库函数要通过系统调用把读写请求传给内核 ,最终由内核驱动磁盘或设备完成I/O操作.C标准库为每个打开的文件分配一个I/O缓冲区以加速读写操作,通过文件的FILE 结构体可以找到这

把《c++ primer》读薄(3-3 标准库bitset类型)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型(模版) 需要处理二进制位的时候,可以使用c++标准库提供的bitset类型,它也是类模版,类似vectro容器,唯一不同的是,bitset类型需要说明长度,使用常量表达式给出的整型字面值或者已经初始化的cosnt对象. bitset<32> bit;//从0到31位算的,bit的32位每位初始化为

windows-如何利用C/C++标准库编写跨平台的程序?

问题描述 如何利用C/C++标准库编写跨平台的程序? 如题,最近公司给了个小任务,让在一个工程中找出符合某种条件的代码,并记录下行号. 听着好像比较简单,因为公司的项目在win,linux下有两个版本,所以小白同学比较装逼的想做一个跨平台的版本,然后,炸了. 思路好像还比较好找,因为是C++的项目,所以只要遍历某文件夹下的所有子文件以及子文件夹,找到.c或者.cpp文件,然后在其中寻找符合条件的语句连同行号写入文件中,可是,C/C++的标准库没有办法直接操作目录么? 找到各种解决方案都说目录是要

Python标准库11 多进程探索 (multiprocessing包)

原文:Python标准库11 多进程探索 (multiprocessing包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   在初步了解Python多进程之后,我们可以继续探索multiprocessing包中更加高级的工具.这些工具可以让我们更加便利地实现多进程.   进程池 进程池 (Process Pool)可以创建多个进程.这些进程就像是随时待命的士兵,准备执行任务(程序).一个进程池中可以容纳多个待命的士兵.

Python标准库06 子进程 (subprocess包)

原文:Python标准库06 子进程 (subprocess包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢Tolbkni Kao帮我纠正错误   这里的内容以Linux进程基础和Linux文本流为基础.subprocess包主要功能是执行外部的命令和程序.比如说,我需要使用wget下载文件.我在Python中调用wget程序.从这个意义上来说,subprocess的功能与shell类似.   subprocess以

Python标准库01 正则表达式 (re包)

原文:Python标准库01 正则表达式 (re包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   我将从正则表达式开始讲Python的标准库.正则表达式是文字处理中常用的工具,而且不需要额外的系统知识或经验.我们会把系统相关的包放在后面讲解.   正则表达式(regular expression)主要功能是从字符串(string)中通过特定的模式(pattern),搜索想要找到的内容. 语法 之前,我们简介了字符串相关