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反射的更多相关文章

  1. JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac

    记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...

  2. golang:reflect反射

    因为之前一直以C++为主要开发语言,所以刚接触go语言中的reflect时感觉很懵逼,因此决定找资料彻底学习一下. 到底反射是什么? https://blog.golang.org/laws-of-r ...

  3. java reflect反射调用方法invoke

    类定义 package Reflect; public class MyTest { public int a; public static int b; public static final in ...

  4. Java reflect 反射学习笔记

    1. class 类的使用 万事万物皆对象 (基本数据类型, 静态成员不是面向对象), 所以我们创建的每一个类都是对象, 即类本身是java.lang.Class类的实例对象, 但是这些对象不需要 n ...

  5. golang基础--reflect反射

    反射的知识点比较晦涩,后期会对此知识点展开深入的分析及示例代码展示 反射可达大提高程序的灵活性,使得inferface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象 ...

  6. Golang reflect 反射

    反射的规则如下: 从接口值到反射对象的反射  从反射对象到接口值的反射  为了修改反射对象,其值必须可设置   -------------------------------------------- ...

  7. GO_09:GO语言基础之reflect反射

    反射reflection 1. 反射可以大大的提高程序的灵活性,使得 interface{} 有更大的发挥余地 2. 反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息 3. 反 ...

  8. GO语言基础之reflect反射

    反射reflection 1. 反射可以大大的提高程序的灵活性,使得 interface{} 有更大的发挥余地 2. 反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息 3. 反 ...

  9. python的reflect反射方法

    核心内容专自:http://www.liujiangblog.com/course/python/48 在自动化测试的时候,需要从excel中读取关键字,此关键字对应一个方法,如何使用该关键字去调用真 ...

  10. java reflect反射---Java高级开发必须懂的

    理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助.  一.Class类的使用         1.万事万物皆对象,( ...

随机推荐

  1. php生成rss订阅

    代码: <?php $host = $_SERVER['HTTP_HOST']; $xmls = '<?xml version="1.0" encoding=" ...

  2. ORACL EXP导出数据说明

    转载自:http://www.jb51.net/article/17358.htm Oracle 数据库导出(exp)导入(imp)说明   exp 将数据库内的各对象以二进制方式下载成dmp文件,方 ...

  3. Codeforces 455A Boredom 取数字的dp

    题目链接:点击打开链接 给定一个n长的序列 删除x这个数就能获得x * x的个数 的分数,然后x+1和x-1这2个数会消失.即无法获得这2个数的分数 问最高得分. 先统计每一个数出现的次数.然后dp一 ...

  4. JavaScript入门:004—JS凝视的写法和基本运算符

    JS的凝视JS中加凝视和寻常写C#代码是几乎相同的.有//和/* */这两种.单行凝视使用双斜杠比如. <script type="text/javascript"> ...

  5. jQuery整理笔记八----jQuery的Ajax

    Ajax,我一直读的是"阿贾克斯",据当时大学老师讲该读音出处是依据当年风靡欧洲的荷兰足球俱乐部阿贾克斯的名字来的,我认为说法挺靠谱的. jQuery封装了Ajax的交互过程,用户 ...

  6. COGS 693. [SDOI2005]Antiprime数 唯一分解定理逆用

    693. Antiprime数 ★★   输入文件:antip.in   输出文件:antip.out   简单对比 时间限制:1 s   内存限制:128 MB 如果一个自然数n(n>=1), ...

  7. SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 4)

    (五)列表查询中的阈值限制 在之前版本的SharePoint 中,如果在查询的时候没有指定返回数目,那么SharePoint将会查找该列表中所有的条目,这可能会造成在SQL表中需要返回大量的条目,极大 ...

  8. 报表生成之Hyperion SQR

    SQR(Structured Query Reporter)是为从数据库管理系统生成报告而设计的一种编程语言.名称是结构化查询报告的缩写,这表明它与SQL(结构化查询语言)的关系.任何SQL语句可以嵌 ...

  9. python——re模块(正则表达)

    python——re模块(正则表达) 两个比较不错的正则帖子: http://blog.csdn.net/riba2534/article/details/54288552 http://blog.c ...

  10. boost之string_algo

    string_algo是用于处理字符串查找,替换,转换等一系列的字符串算法 前缀i:表示大小写不敏感 后缀_copy:表示不变动输入,返回处理结果的拷贝 后缀_if:表示算法需要一个判断式的谓词函数对 ...