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. JavaScript入门:004—JS凝视的写法和基本运算符

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

  2. Python_Selenium之鼠标右键

    Python_Selenium之鼠标右键 一.步骤: (以百度为例)获取百度网址 找到需要右键的元素(定位),xpath表达式为“//*[@id='lg']/img” 然后,右键选择“在新标签页中打开 ...

  3. ubuntu 16.04 系统语言汉化

    转载自:https://jingyan.baidu.com/article/5553fa82cedaa265a2393420.html

  4. (转载)java提高篇(五)-----抽象类与接口

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 本文是转载的(尊重原著),原文地址:http://www.cnblogs.com/chenssy/p/3376708.html 抽象类 ...

  5. 《从零开始学Swift》学习笔记(Day 12)——说几个特殊运算符

    原创文章,欢迎转载.转载请注明:关东升的博客   除了一些常用的运算符,还有一些其他的: •      引用号(.):实例调用属性.方法等操作符. •      问号(?):用来声明可选类型. •   ...

  6. 关于微信小程序下拉出现三个小点

    包子这天看美团外卖的小程序,再瞅瞅自己的背景色,发现,美团下拉的时候有三个小点,但是我自己的校车徐下拉的时候没有三个小点,很是郁闷,于是各种的找各种的找,发现,这三个小点是微信小程序自带的,你只需要设 ...

  7. XShell安装(五)

    Xshell就是一个远程控制Centos的软件:(用XShell比较方便,试用的都知道,界面也人性化) 详细介绍请看 百度百科 我随便百度下载了一个中文版的 给下地址  http://rj.baidu ...

  8. cxGrid时间格式与导出Excel

    引用cxFormats单元: ShortDateFormat := 'dd/mm/yyyy'; DateSeparator := '/'; cxFormatController.UseDelphiDa ...

  9. vnc server配置、启动、重启与连接

    目前有两种比较流行的方式:XDM(X display manager)方案和VNC方案,而我个人比较倾向于VNC方案,一是因为VNC方案配置起来相对比较容易,二是VNC方案支持多种连接方式,比如通过浏 ...

  10. 爬虫四 selenium模块详细参数

    selenium元素定位方法 一.访问页面并获取网页html from selenium import webdriver browser = webdriver.Chrome() browser.g ...