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.万事万物皆对象,( ...
随机推荐
- Xcode7.3打包ipa文件 报错和解决
An error occurred during export. The file “xxx.ipa” couldn’t be opened because there is no such file ...
- linux命令之面试题1
1.请解释下列10个shell命令的用途 top:是linux下常用的性能分析工具,能够实时的显示系统中各个进程的资源占用情况,类似于windows的资源管理器,查看系统的cpu,内存,运行时间,交互 ...
- 安装使用yarn,使用国内镜像加速npm和yarn
安装yarn https://yarnpkg.com/lang/zh-hans/docs/install/ 使用国内镜像加速npm和yarn 1. npm config set registry=ht ...
- shell 命令getopts用法
写shell脚本常见sh test.sh -m 2 -d 3的写法 事例脚本: #!/bin/bash while getopts ":a:b:c:" arg #选项后面的冒号表示 ...
- Android———最详细的系统对话框(AlertDialog)详解
在实际应用开发中,用到系统对话框中的情况几乎是没有的.按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的. 即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它 ...
- 【BZOJ1811】[Ioi2005]mea 乱搞
[BZOJ1811][Ioi2005]mea Description 考虑一个非递减的整数序列 S1,....Sn+1(Si<=Si+1 1<=i<=n). 序列M1...Mn是定义 ...
- 【BZOJ2648】SJY摆棋子 KDtree
[BZOJ2648]SJY摆棋子 Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找 ...
- 【BZOJ4810】[Ynoi2017]由乃的玉米田 bitset+莫队
[BZOJ4810][Ynoi2017]由乃的玉米田 Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐.由乃认为玉米田不美,所 ...
- N - Broken Keyboard (a.k.a. Beiju Text)(DFS,链表)
N - Broken Keyboard (a.k.a. Beiju Text) Time Limit:1000MS Memory Limit:0KB 64bit IO Format:% ...
- Java的==与equals之辨
=======================原理速记=================================== equals重载后比较内容,==比较指针.否则equls等同于== (Ja ...