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. crm操作电子邮件

    using System;     using Microsoft.Xrm.Sdk;     using Microsoft.Crm.Sdk.Messages;     using Microsoft ...

  2. [Unity3D]Unity3D游戏开发之伤害数值显示

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.众所周知,在RPG游戏策划中最为重要的一个环节是数值策划.数值策划是一个关于游戏平衡方面的概念 ...

  3. idea Plugin "Maven Integration Extension" was not loaded: required plugin "Maven Integration" is disabled

    由于自己运行了eclipse maven及idea maven 同时操作,可能产生了以上错误.既: idea  Plugin "Maven Integration Extension&quo ...

  4. HTML学习笔记——常用元素及其属性(二)

    一.HTML表单 -- form标签 -- 与浏览者交互 1.form 标签 -- 代表HTML表单 form标签是成对出现的,以<form>开始,以</form>结束 属性. ...

  5. Travel(最短路)

    Travel The country frog lives in has nn towns which are conveniently numbered by 1,2,…,n1,2,…,n. Amo ...

  6. 使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法

    使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法 idea中springboot整合mybatis时,通过@Autowired ...

  7. JS中的this变量的使用介绍

    在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,在本文将为大家详细介绍下JavaScript中this的使用,感兴趣的朋友可以参考下. JavaScript中t ...

  8. cron_action

    crontab   using shell script to automate linux system maintenance tasks Linux中用crontab例行工作安排_Linux教程 ...

  9. python的标准类型分类

    数据属性 储存模型 更新模型 访问模型 数字 标量/原子类型 不可变类型 直接存取 字符串 标量/原子类型 不可变类型 顺序 列表 容器  可变类型 顺序  元组 容器 不可变类型 顺序 字典 容器 ...

  10. 稀疏自动编码器 (Sparse Autoencoder)

    摘要: 一个新的系列,来自于斯坦福德深度学习在线课程:http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial.本文梳理了该教程第一 ...