Go reflect反射
Go语言中的反射非常强大,可以对string, int, struct, func...进行反射,使用起来也比较简单。
示例1:反射函数
package main import (
"fmt"
"reflect"
) func Hello() {
fmt.Println("hello world!")
} func main() {
valueOf := reflect.ValueOf(Hello)
valueOf.Call(nil)
}
示例2:反射带参数的函数
package main import (
"fmt"
"reflect"
) func Print(str ...string) {
fmt.Println("str=", str)
}
func main() {
valueOf := reflect.ValueOf(Print)
i := make([]reflect.Value, 3)
i[0] = reflect.ValueOf("")
i[1] = reflect.ValueOf("")
i[2] = reflect.ValueOf("") valueOf.Call(i)
}
示例3: 结构体反射,实现Struct to Json的转换
package main import (
"reflect"
"fmt"
) type User struct {
Name string `json:"name"`
Age int
Sex string
} func TestType(a interface{}) {
typeOf := reflect.TypeOf(a)
fmt.Printf("typeof = %v\n", typeOf)
kind := typeOf.Kind()
switch kind {
case reflect.Int:
fmt.Println("a is an int")
case reflect.String:
fmt.Println("a is a string")
}
} func TestValue(a interface{}) {
valueOf := reflect.ValueOf(a)
switch valueOf.Kind() {
case reflect.Ptr:
i := valueOf.Elem().Type()
switch i.Kind() {
case reflect.Int:
valueOf.Elem().SetInt()
case reflect.String:
valueOf.Elem().SetString("hello world")
}
}
} func Marshal(a interface{}) {
valueOf := reflect.ValueOf(a)
typeOf := valueOf.Type()
jsonStr := ""
switch typeOf.Kind() {
case reflect.Struct:
numField := typeOf.NumField()
for i:=; i<numField; i++ {
structField := typeOf.Field(i)
valueField := valueOf.Field(i)
name := structField.Name
if structField.Tag.Get("json") != "" {
name = structField.Tag.Get("json")
}
if valueField.Type().Kind() == reflect.String {
jsonStr += fmt.Sprintf(" \"%s\": \"%v\"", name, valueField.Interface())
} else {
jsonStr += fmt.Sprintf(" \"%s\": %v", name, valueField.Interface()) }
if numField - i > {
jsonStr += ",\n"
}
}
jsonStr = "{\n" + jsonStr + "\n}"
}
fmt.Printf("%s", jsonStr)
} func main() {
var a int
TestType(a) var b string
TestType(b) TestValue(&a)
TestValue(&b) fmt.Println(a, b) var user User
user.Name = "alex"
user.Age =
user.Sex = "man"
Marshal(user)
}
参考文章:https://studygolang.com/articles/896
Go reflect反射的更多相关文章
- JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac
记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...
- golang:reflect反射
因为之前一直以C++为主要开发语言,所以刚接触go语言中的reflect时感觉很懵逼,因此决定找资料彻底学习一下. 到底反射是什么? https://blog.golang.org/laws-of-r ...
- java reflect反射调用方法invoke
类定义 package Reflect; public class MyTest { public int a; public static int b; public static final in ...
- Java reflect 反射学习笔记
1. class 类的使用 万事万物皆对象 (基本数据类型, 静态成员不是面向对象), 所以我们创建的每一个类都是对象, 即类本身是java.lang.Class类的实例对象, 但是这些对象不需要 n ...
- golang基础--reflect反射
反射的知识点比较晦涩,后期会对此知识点展开深入的分析及示例代码展示 反射可达大提高程序的灵活性,使得inferface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象 ...
- Golang reflect 反射
反射的规则如下: 从接口值到反射对象的反射 从反射对象到接口值的反射 为了修改反射对象,其值必须可设置 -------------------------------------------- ...
- GO_09:GO语言基础之reflect反射
反射reflection 1. 反射可以大大的提高程序的灵活性,使得 interface{} 有更大的发挥余地 2. 反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息 3. 反 ...
- GO语言基础之reflect反射
反射reflection 1. 反射可以大大的提高程序的灵活性,使得 interface{} 有更大的发挥余地 2. 反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息 3. 反 ...
- python的reflect反射方法
核心内容专自:http://www.liujiangblog.com/course/python/48 在自动化测试的时候,需要从excel中读取关键字,此关键字对应一个方法,如何使用该关键字去调用真 ...
- java reflect反射---Java高级开发必须懂的
理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助. 一.Class类的使用 1.万事万物皆对象,( ...
随机推荐
- 探讨把一个元素从它所在的div 拖动到另一个div内的实现方法
故事背景: 接到一个新需求,要求用vue搞,主要是拖动实现布局,关键点有:单个组件拖动,一行多列里面的组件拖动, 单个组件可以拖入一行多列里, 单个组件的拖动好实现,关键是把一个组件拖动到另一个类似 ...
- asp.net 关于字符串内范围截取的一点方法总结
前两天有一位网友提出了一个字符串内截取字符串的问题,除了用普通的字符串截取的方式外,我推荐的是用LINQ方式来截取.两者实际上差别不是很大,都是采用字符串截取方式,但后者从写法和观察效果会比前者简单实 ...
- PHP中通过数组遍历找出最小值
举例: $a = array(1,2,4,0,9,8,6);//定义一个数组 $len = count($a);//获取数组的长度 $min = $a[0];//默认情况下数组的第一个值是最小的 fo ...
- Linux之(tomcat)服务之服务调优
Tomcat调优原则: ● 增加连接数 ● 调整工作模式 ● 启用gzip压缩 ● 调整JVM内存大小 ● 作为web服务器时,与Apache或者Nginx整合 ● 合理选择垃圾回收算法 ● 尽量使用 ...
- 关于lucene的RAMDirectory和FSDirectory的性能问题的困惑
关于lucene的RAMDirectory和FSDirectory的性能问题的困惑 在lucene in Action书中说RAMDirectory的性能总是比FSDirectory优越(书中2.7. ...
- CGI FastCGI PHP-CGI PHP-FRM
CGI(Common GateWay Interface )通用网关接口,CGI可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据.CGI描述了客户端和这个程序之间传输数据的一种协议标 ...
- Core Services层
本文转载至 http://jingyan.baidu.com/article/cdddd41c57360853cb00e124.html Core Services层是系统很多部分的基础部分,也许应用 ...
- jpofiler监控JVM
1.官方下载地址,选择自己想要的版本 https://www.ej-technologies.com/download/jprofiler/version_92 2.分为linux服务端.window ...
- Axis2Service客户端访问通用类集合List自定义类型
Axis2 服务四种客户端调用方式: 1.AXIOMClient 2.generating a client using ADB 3.generating a client using XMLBean ...
- 【python】-- Django ModelForm
Django ModelForm Django的ModelForm的验证方式相比较form + Model的验证方式有下列区别: ModelForm没有form + Model的低耦合性 ModelF ...