Go reflect

package main

import (
        "fmt"
        "reflect"
)

func main() {
        x := "hello world"
        p := reflect.TypeOf(x)
        v := reflect.ValueOf(x)

        fmt.Println("typeof:", p, " valueof type:", v.Type(), " valueof kind:", v.Kind())

        //pp := reflect.TypeOf(&x)
        vv := reflect.ValueOf(&x)
        fmt.Println("vv.Type=", vv.Type(), " vv.Kind=", vv.Kind())
}

TypeOf()  与 ValueOf 得到的值调用Type() 返回结果是一样的

但ValueOf得到的值调用Kind()可能一样,因为如果是第二种情况(指针情况), vv.Kind() 打印出来是ptr,而不是 *string

package main

import (
        "fmt"
        "reflect"
)

func main() {
        x := "hello world"
        p := reflect.TypeOf(x)
        v := reflect.ValueOf(x)

        fmt.Println("typeof:", p, " valueof type:", v.Type(), " valueof kind:", v.Kind())

        //pp := reflect.TypeOf(&x)
        vv := reflect.ValueOf(&x)
        fmt.Println("vv.Type=", vv.Type(), " vv.Kind=", vv.Kind(), " vv.Elem=", vv.Elem())// vv.Elem() 返回hello world
        elem := vv.Elem()
        fmt.Println("valueof.CanSet=", vv.CanSet(), " valueof.Elem.CanSet=", elem.CanSet())//第一个返回false,第二个返回true
}
type T struct {
        A int
        B string
}

func main() {
        x := "hello world"
        p := reflect.TypeOf(x)
        v := reflect.ValueOf(x)

        fmt.Println("typeof:", p, " valueof type:", v.Type(), " valueof kind:", v.Kind())

        //pp := reflect.TypeOf(&x)
        vv := reflect.ValueOf(&x)
        fmt.Println("vv.Type=", vv.Type(), " vv.Kind=", vv.Kind(), " vv.Elem=", vv.Elem())
        elem := vv.Elem()
        fmt.Println("valueof.CanSet=", vv.CanSet(), " valueof.Elem.CanSet=", elem.CanSet())

        fmt.Println("******************************")
        t := T {A:123, B:"hello world"}
        vf := reflect.ValueOf(&t)
        fmt.Println("typeof(t)=", reflect.TypeOf(t), " vf.Type=", vf.Type(), " vf.Kind=", vf.Kind()) //typeof(t)= main.T  vf.Type= *main.T  vf.Kind= ptr

        ee := vf.Elem()
        eet := ee.Type()
        for i := 0; i < ee.NumField(); i ++ {
                f := ee.Field(i)
                fmt.Printf("%s %s  = %v\n", eet.Field(i).Name, f.Type(), f.Interface()) //A int  = 123
        }

        fmt.Printf("%v  %v", eet, ee)//main.T  {123 hello world}
}
                                                                                                                      

Go 依赖注入里用到reflect:

https://github.com/codegangsta/inject

时间: 2024-10-12 03:51:18

Go reflect的相关文章

java.lang.reflect操作对象属性(域)的值

import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /*2015-10-28*/ public class RefactorDemo { /** * @param args * @throws NoSuchFieldException * @throws SecurityException * @throws Ill

Reflect

Reflect 反射是引起SI的一个最基本因素,信号在传输线传播过程中,一旦它所感受到的传输线瞬时阻抗发生变化,那么就必将有发射发生. 反射是由于传输线瞬时阻抗变化而引起的 下面就从理论角度来分析一下反射的机理.反射系数和传输系数的计算 配个简易图来加以说明 图中褐色的为电路板上的大面积铺铜层(GND或者PWR),它是信号的返回路径.绿色和红色是传输线,S1比较宽,S2较窄,很明显在S1和S2的交接处出现了阻抗不连续,根据阻抗计算公式应该是Rs1<Rs2.那么信号传输到这里的时候,从反射的定义来

js-ES6学习笔记-Reflect

1.Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API.Reflect对象的设计目的有这样几个. 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上. 修改某些Object方法的返回结果,让其变得更合理.比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, de

Swift缩水版MJExtension - Reflect的基本使用

github:https://github.com/CharlinFeng/Reflect 直接拖拽Reflect文件夹到您的项目中即可,无任何第三方依赖!文件夹结构说明:.Coding 归档相关.Reflect 反射核心包.Dict2Model 字典转模型.Model2Dict 模型转字典 这里使用plist作为数据源, plist存储的是一个数组, 数组中存储的是字典 plist的结构如下: 将plist数组中的每一个字典转换为模型, 代码如下: RPTableViewController.

自己写一个java.lang.reflect.Proxy代理的实现

前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Proxy类出来,功能和java.lang.reflect.Proxy一样,传入接口.代理内容,生成代理. 抛砖引玉吧,个人觉得自己写一些JDK里面的那些类挺好的,写一遍和看一遍真的是两个不同的概念,写一遍既加深了对于这些类的理解.提升了自己的写代码水平,也可以在写完之后对比一下自己的实现有哪些写得不好

利用java.lang.reflect.Constructor动态实例化对象

1 public class Student { 2     private String name; 3     private Integer age; 4     private Student(String name,Integer age){ 5         this.name=name; 6         this.age=age; 7     } 8     public String getName() { 9         return name;10     }11 

关于java reflect

反射的基石 Class类 对比提问: Person类代表人,它的实例对象就是张三,李四这样一个个具体的人, Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class.对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示? 人 Person Java类 Class Class类代表Java类,它的各个实例对象又分别对应什么呢? 对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等. 一个类被类加载器加载到内存中,

Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWo

1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help | start | stop } 2014-7-12 14:19:28 org.apache.catalina.core.AprLifecycleListener init 信息: Loaded APR based Apache Tomcat Native library 1.1.29 using

sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class异常解决方法

package com.wzs; import java.lang.reflect.ParameterizedType; public class T1<T> {     private Class classt;     public T1() {         ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();         this.classt = (Class)

GO_09:GO语言基础之reflect反射

反射reflection 1. 反射可以大大的提高程序的灵活性,使得 interface{} 有更大的发挥余地 2. 反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息 3. 反射会将匿名字段作为独立字段(匿名字段本质) 4. 想要利用反射修改对象状态,前提是 interface.data 是 settable,即 pointer-interface 5. 通过反射可以"动态"调用方法 示例一: 举例说明反射使用 TypeOf 和 ValueOf 来取得传入类型的