GO语言练习:反射

列举几个反射的例子:1)简单类型反射,2)复杂类型反射,3)对反射回来的数据的可修改属性

1、简单类型反射

  1.1)代码

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var x float64 = 3.4
    v := reflect.ValueOf(x)
    fmt.Println("type :", v.Type())
    fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
    fmt.Println("value:", v.Float())
}

  1.2)运行结果

$ go run reflect.go
type : float64
kind is float64: true
value: 3.4

2、复杂类型反射

  2.1)代码

 1 package main
 2
 3 import (
 4     "fmt"
 5     "reflect"
 6 )
 7
 8 type T struct {
 9     A int
10     B string
11 }
12
13 func main () {
14     t := T{203, "mh203"}
15     s := reflect.ValueOf(&t).Elem()
16     typeOfT := s.Type()
17     for i := 0; i < s.NumField(); i++ {
18         f := s.Field(i)
19         fmt.Printf("%d: %s %s = %v\n", i,
20         typeOfT.Field(i).Name, f.Type(), f.Interface())
21     }
22 }

  2.2)运行结果

$ go run structreflect.go
0: A int = 203
1: B string = mh203

3、通过反射获得的变量的可设置属性

  3.1)代码实例

 1 package main
 2
 3 import (
 4     "fmt"
 5     "reflect"
 6 )
 7
 8 func testA() {
 9     var x float64 = 3.4
10     v := reflect.ValueOf(x)
11     if(true == v.CanSet()) {
12         fmt.Println("v is setable")
13         //v.Set(4.1)
14     } else {
15         fmt.Println("v is not setable")
16     }
17 }
18
19 func testB() {
20     var x float64 = 3.4
21     p := reflect.ValueOf(&x)
22     fmt.Println("type of p:", p.Type())
23     fmt.Println("settablitty of p :", p.CanSet())
24
25     v := p.Elem()
26     fmt.Println("settablitty of v:", v.CanSet())
27
28     v.SetFloat(7.1)
29     fmt.Println(v.Interface())
30     fmt.Println(x)
31 }
32
33 func main() {
34     testA()
35     testB()
36 }

  3.2)运行结果

$ go run set.go
v is not setable
type of p: *float64
settablitty of p : false
settablitty of v: true
7.1
7.1
时间: 2024-10-13 22:21:44

GO语言练习:反射的相关文章

Java语言中反射动态代理接口的解释与演示

Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan

Java语言的反射机制 笔记 摘自 http://blog.csdn.net/kaoa000/article/details/8453371

在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. 1.Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类.在运行时构造任意一个类的对象.在运行时判断任意一个类所具有的成员变量和方法.在运行时调用任意一个对象的方法 2.Reflection 是Java被视为动态(或准动态)语言的一个关键性质.

Java记录 -83- Java语言的反射机制

Java语言的反射机制 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制. Java反射机制主要提供了以下功能: 1. 在运行时判断任意一个对象所属的类: 2. 在运行时构造任意一个类的对象: 3. 在运行时判断任意一个类所具有的成员变量和方法: 4. 在运行时调用任意一个对象的方法: Reflection是java

go语言之反射

一: 反射 1 反射是指在程序运行期对程序本身进行访问和修改的能力 2 go程序在运行期使用reflect包访问程序的反射信息 1查看类型.字段和方法 package main import ( "fmt" "reflect" ) //结构体 type User struct { Id int Name string Age int } //绑定方法 func (u User) Hello() { fmt.Println("Hello User!"

go语言系列-反射

目录 反射 引出反射 使用反射机制,编写函数的适配器,桥连接 反射的应用场景 反射重要的函数和概念 反射的快速入门 反射的注意事项和细节 反射练习 反射最佳实践 反射 反射可以在运行时动态获取变量的各种信息,比如变量的类型(type),类别(kind) 如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段.方法) 通过反射,可以修改变量的值,可以调用关联的方法 使用反射,需要import("reflect") 引出反射 import ( "encoding/jso

go语言之行--接口(interface)、反射(reflect)详解

一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: interface是方法的集合 interface是一种类型,并且是指针类型 interface的更重要的作用在于多态实现 interface定义 type 接口名称 interface { method1 (参数列表) 返回值列表 method2 (参数列表) 返回值列表 ... } interf

Go语言基础之反射

本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分.在运行程序时,程序无法获取自身的信息. 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称.类型信息.结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的

10. Go 语言反射

Go 语言反射 反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分.在运行程序时,程序无法获取自身的信息. 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称.类型信息.结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们. Go程序在运行期使用reflect包访问程序的反射信息. 其它语言中的反射 C/C++ 语言没有支持反射功能,只能通过 ty

18.Go语言基础之反射

1.变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 2.反射介绍 在Python中,Java中,都有反射的概念. 反射是"指程序运行期对程序本身进行访问和修改的能力". 程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分.在运行程序时,程序无法获取自身的信息. 支持反射的语言,可以再程序编译期将变量的反射信息,如字段名称.类型信息.结构体信息等正和岛可执行文件中,并给程序提供接口,访问反射信息,

java 反射类的理解与应用

本文主要解析的类是: ClassLodaer,Class,Field,Method,Constructor. 本文的目标很简单,只是对这些常用的反射类进行简单解释.对这些类中常用方法进行介绍. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在