golang反射初试

golang反射来自Go AST(Abstract Syntax Tree). reflect操作更多像traverse AST.

t := reflect.TypeOf(obj)

使用TypeOf()获取类型信息.

v := reflect.ValueOf(obj)

使用ValueOf获取值信息

如果t是Array, Slice, Map, Chan或Pointer,可以继续继续使用Elem()方法获取其元素的更多信息.

Elem(): 必须是Array, Slice, Map, Chan或 Pointer类型.

Field(int)或FieldByName(string)或FieldXXX()相关操作: 必须是Struct类型

Int(), String()...等叶结点操作: 必须是相应类型, 否则panic

对于Struct类型, 每个Field具有下列属性:

Name, Type, Tag是用户定义的

Index, Offset, PkgPath是GO AST生成的.

时间: 2024-08-30 09:02:34

golang反射初试的相关文章

C++笔记2 :“反射”初试水

像Java或者是很多脚本语言,由于有着 "不用编译成机器码,直接解释执行" 这种先天优势,实现反射机制简单的一B.. 再反观我大C++,又一次遇到了麻烦... 其实我的需求特别简单:就是利用字符串可以调用同名的函数而已... 说的清楚一点,就是传入参数 "hello",可以调用 void hello() 这个函数... C++编译后已经丢掉了函数名,不可能做到这个需求,而很多时候这个需求都是必须的,然后我就得到了下面两种大概可行的做法: 1.写个map,key为字符

golang 反射应用(二)

golang反射应用(二) package test import ( "reflect" "testing" ) //定义适配器 func TestReflect(t *testing.T){ //声明回调函数 call1 := func(v1,v2 int){ t.Log(v1,v2) //1 2 } call2 := func(v1,v2 int,s string){ t.Log(v1,v2,s) //1 2 test2 } //定义全局变量 var ( fu

[golang]反射的用处--代码自动生成

背景: go语言处理db.json的时候,具体代码的变量定义和db字段.json输出的时候可能不一样. 这个时候,我们需要用tag的方式来进行定义. 例如: type MyStruct struct { Name string `json:"name"` MaxHeight int `json:"max_height"` } 如果字段或结构体非常多的话,有十几二十几个,就非常的麻烦. 因此,就利用golang的反射,做了一个小工具来自动生成,具体使用如下: //你的

golang 反射

转自:http://golanghome.com/post/546 自己在用Go写Web框架时,遇到要从接口中返回对象信息的技术问题.网上关于Go中接口反射的资料较少,所以自己学习了一段时间,特将结果与大家分享. 代码约定 import ( "fmt" "reflect" ) type boy struct { Name string age int } type human interface { SayName() SayAge() } func (this *

GOLANG 反射法则

译自[blog.golang.org/laws-of-reflection] 在计算机中, 反射是程序通过类型,检测到它自己的结构能力:是一种元编程程:也是一个具大的混淆点 在本文中,我们将通过解释反射是如何在GO中工作的来澄清它.每个语言的反射模式是不同的.本文着重于GO,所以后文中的反射都是指GO中的反射 1.类型和接口因为反射是修建于类型系统之上, 所以让我们从GO的类型开始讲吧.GO是静态类型语言. 每个变量都有一个静态类型. 也就是说, 每一个已经类型在编译时已经固定了其类型:int,

golang 反射解惑

Type和Kind的区别 直接看例子: type Myint int type Person struct { } func main() { var myint Myint= 1 var person Person= Person{} s := 1 var intPtr =&s mySlice := []string{} myMap := map[string]int{} myintType := reflect.TypeOf(myint) personType := reflect.Type

GO开发[六]:golang反射(reflect)

反射 反射:可以在运行时动态获取变量的相关信息 ? Import ("reflect") reflect.TypeOf,获取变量的类型,返回reflect.Type类型 reflect.ValueOf,获取变量的值,返回reflect.Value类型 reflect.Value.Kind,获取变量的类别,返回一个常量 reflect.Value.Interface(),转换成interface{}类型 获取变量的值: reflect.ValueOf(x).Float() reflect

golang反射

反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字段本质) 想要利用反射修改对象状态,前提是interface.data是settable,即pointer-interface 通过反射可以"动态"调用方法 对某一个struct进行反射的基本操作 package main import ( "fmt" "re

Golang-interface(四 反射)

github:https://github.com/ZhangzheBJUT/blog/blob/master/reflect.md 一 反射的规则 反射是程序运行时检查其所拥有的结构,尤其是类型的一种能力:这是元编程的一种形式.它同时也是造成混淆的重要来源. 每个语言的反射模型都不同(同时许多语言根本不支持反射).本节将试图明确解释在 Go 中的反射是如何工作的. 1. 从接口值到反射对象的反射 在基本的层面上,反射只是一个检查存储在接口变量中的类型和值的算法.在 reflect 包中有两个类