package main

/**
反射reflection 反射可大大提高程序的灵活性,使得 interface{} 有更大的发挥余地
反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息
反射会将匿名字段作为独立字段(匿名字段本质)
想要利用反射修改对象状态,前提是 interface.data 是 settable,
即 pointer-interface
- 通过反射可以“动态”调用方法 */
import (
"fmt"
"reflect"
) type User struct {
Id int
Name string
Age int
} type Manager struct {
User //嵌入字段是User
title string
} func (u User) Hello() { //为结构体增加方法
fmt.Println("hello wloid")
} func (u User) Hellooo(name string) { //为结构体增加方法
fmt.Println("hello ", name, "my name id ", u.Name)
} func main() {
u := User{, "US", }
Info(u) //反射取出匿名字段//反射匿名、嵌入字段
m := Manager{User: User{, "oj", }, title: "title"}
t := reflect.TypeOf(m)
fmt.Println(t) //m的类型,main.Manager
fmt.Println("%v", t.Field()) //取manager中索引为0的字段User,{User main.User 0 [0] true}
fmt.Println("%v", t.Field()) //取manager中索引为1的字段title,{title main string 32 [1] false}
fmt.Println("%v", t.FieldByIndex([]int{, })) //取出User里面的id,[]int{0, 0}是一个int类型的slice,
//第一个0表示User是Manager的第一个,第二个0表示id是User的第一个,{Id int 0 [0] false}
fmt.Println("%v", t.FieldByIndex([]int{, })) //{Age int 24 [2] false} x :=
v := reflect.ValueOf(&x)
fmt.Println(v) //0xc042048158
v.Elem().SetInt()
fmt.Println(x) //9 //接口中的对象通过反射对值进行修改
w := User{, "u2", }
Set(&w)
fmt.Println(w) //{2 bubaibai 22} //通过反射调用方法
y := User{, "u3", }
v = reflect.ValueOf(y) //通过反射得到对象本身 mv := v.MethodByName("Hellooo") //得到Hellooo方法
args := []reflect.Value{reflect.ValueOf("hhh000")} //参数
mv.Call(args) //调用方法,hello hhh000 my name id u3 } //接口中的对象通过反射对值进行修改
func Set(o interface{}) {
v := reflect.ValueOf(o) //得到值,就是通过反射得到的值本身,
fmt.Println("V------------V===", v) //&{2 u2 22} //判断是不是point interface,因为要调用Elem方法取得实际的对象
if v.Kind() == reflect.Ptr && !v.Elem().CanSet() { //CanSet表示能够修改
fmt.Println("不能修改")
return
} else {
v = v.Elem()
} if f := v.FieldByName("Name"); f.Kind() == reflect.String { //这里是string,就是reflect.String就调用SetString,
f.SetString("bubaibai")
}
} //反射已知字段
func Info(i interface{}) { //打印穿进去接口的信息
t := reflect.TypeOf(i)
fmt.Println("Type: ", t.Name()) //类型,Type: User v := reflect.ValueOf(i) for i := ; i < t.NumField(); i++ { //NumField是字段数量
f := t.Field(i) //字段
val := v.Field(i).Interface() //字段所对应的值
fmt.Println("字段:", f.Name, f.Type, val) //字段的名称,类型,值:Id int 1,Name string US,Age int 12
} for i := ; i < t.NumMethod(); i++ {
m := t.Method(i)
fmt.Println("方法:", m.Name, m.Type) //Hello func(main.User)
}
}

go13---反射reflection的更多相关文章

  1. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  2. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  3. [整理]C#反射(Reflection)详解

    本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...

  4. CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)

    CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...

  5. 代理(Proxy)和反射(Reflection)

    前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...

  6. Golang 反射reflection

    反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字 ...

  7. C# 反射(Reflection)技术

    本文参考自C#反射(Reflection)详解,纯属学习笔记,加深记忆 在介绍反射前,先介绍一个重要的知识点         .Net应用程序是由程序集(Assembly).模块(Module).类型 ...

  8. C#反射(Reflection)详解

    1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...

  9. C# 反射Reflection——反射反射程序员的快乐

    一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Ne ...

  10. Laravel学习笔记之PHP反射(Reflection) (上)

    Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读  ·  读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...

随机推荐

  1. Nginx(alias 和 root的区别)

    Nginx(alias 和 root的区别)1.alias 和 root 的区别: location /request_path/image { root /local_path/image/; } ...

  2. Python之游戏开发-飞机大战

    Python之游戏开发-飞机大战 想要代码文件,可以加我微信:nickchen121 #!/usr/bin/env python # coding: utf-8 import pygame impor ...

  3. python爬虫框架—Scrapy安装及创建项目

    linux版本安装 pip3 install scrapy 安装完成 windows版本安装 pip install wheel 下载twisted,网址:http://www.lfd.uci.edu ...

  4. java连接MySQL数据库并读取内容

    package sqldemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSe ...

  5. BNUOJ 2947 Buy Tickets

    Buy Tickets Time Limit: 4000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID ...

  6. hihoCoder#1042 跑马圈地

    原题地址 经网友jokeren提醒,后面给出的代码虽然可以AC原题,但存在bug,主要是在矩形覆盖情况的判断上处理的不够完全. 看似挺复杂的,但是仔细分析一下可以化简: 首先,不用枚举周长,因为更长的 ...

  7. poj 3648 2-sat 输出任意一组解模板

    转载地址:http://blog.csdn.net/qq172108805/article/details/7603351 /* 2-sat问题,题意:有对情侣结婚,请来n-1对夫妇,算上他们自己共n ...

  8. memcache 原理 & 监测 & 查看状态 & stats & 结构

    Mencache内存存储方式:slab/LRU,采用预先申请固定大小的内存页(slab/page),然后再把内存分成多个块(chunk) 先放一张从网上找到的memcache内存结构图,觉得非常的赞:

  9. springboot整合mybatis连接mysql数据库出现SQLException异常

    在springboot整合mybatis连接数据库的时候,项目中遇到一个SQLException,我检查了properties配置文件,看数据源有没有配错,检查有没有打错字,在数据库中把sql语句查询 ...

  10. mac idea快捷键(部分常用)

    shift+F6重命名 shift+enter 换到下一行 shift+F8等同eclipse的f8跳到下一个断点,也等同eclipse的F7跳出函数 F8等同eclipse的f6跳到下一步F7等同e ...