go语言中的反射

数据市
• 阅读 429

以前用Java开发的时候,尤其是接触到稍微底层一点的东西,比如AOP,动态代理这些东西,都要用到反射,现在学习go语言,发射这些反射和Java里面的及其类似,不过也有差异,以下是一些代码演示

基本数据类型的反射

package main
//反射,基本数据类型
import (
    "fmt"
    "reflect"
)

type myInt int
type Person struct {
    Name string
    Age  int
}

func reflectType(v interface{}) {
    typeOf := reflect.TypeOf(v)
    name := typeOf.Name()
    kind := typeOf.Kind()
    fmt.Printf("【typeof】: %v, 【Name】: %v, 【Kind】: %v\n", typeOf, name, kind)
}
func reflectValue(v interface{}) {
    val := reflect.ValueOf(v)
    kind := val.Kind()
    fmt.Println("原始类型:", kind)
    switch kind {
    case reflect.Int:
        fmt.Println(val.Int())
    case reflect.String:

        fmt.Println(val.String())
    case reflect.Float32:
        fmt.Println(val.Float())
    default:
        fmt.Println("还没有去判断这个类型")
    }
}
func resetValue(v interface{}) {
    val := reflect.ValueOf(v)
    kind := val.Kind()
    //如果传入的参数不是指针类型,那么就不能对其原始的变量进行赋值
    //但是如果传入的参数是指针类型,通过val.Kind()方法获取到的是ptr类型
    //如果想要判断是int,则需要使用val.Elem().Kind()方法
    fmt.Println(kind)
    k := val.Elem().Kind()
    fmt.Println("实际类型:", k)
    if k == reflect.Int64 {
        val.Elem().SetInt(2323)
    } else if k == reflect.String {
        val.Elem().SetString("hello golang")
    } else {
        fmt.Println("暂时没设置这种类型")
    }
}
func main() {
    a := 10
    b := 12.3
    c := true
    d := "nihao"
    var e myInt = 12
    f := Person{
        Name: "nihao",
        Age:  12,
    }
    g := [3]int{0, 1, 2}
    h := []int{4, 5}
    var i = &a

    reflectType(a)
    reflectType(b)
    reflectType(c)
    reflectType(d)
    reflectType(e)
    reflectType(f)
    reflectType(g)
    reflectType(h)
    reflectType(i)
    reflectValue(23)
    reflectValue("string")

    var aint = 12
    resetValue(&aint)
    fmt.Println(aint)

}

结构体的反射

package main

import (
    "fmt"
    "reflect"
)

//反射,结构体

type Person struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
    Address string
}

func (p Person) GetInfo() string {
    return fmt.Sprintf("Name:%v,Age:%v,Address:%v", p.Name, p.Age, p.Address)
}
func (p *Person) SetInfo(name string, age int, address string) {
    p.Name = name
    p.Age = age
    p.Address = address
}
func main() {
    var p = Person{
        Name:    "silk",
        Age:     20,
        Address: "苏州",
    }
    t := reflect.TypeOf(p)
    if t.Kind() != reflect.Struct && t.Elem().Kind() != reflect.Struct {
        fmt.Println("传入的类型不是结构体")
    }
    field := t.Field(0)
    fmt.Println(field.Name)
    fmt.Println(field.Type)
    fmt.Println(field.Tag.Get("json"))
    name, ok := t.FieldByName("Age")
    if ok {
        fmt.Println(name.Name)
        fmt.Println(name.Type)
        fmt.Println(name.Tag.Get("json"))
    }
    for i := 0; i < t.NumField(); i++ {
        fmt.Printf("name:%v,type:%v,tag:%v\n", t.Field(i).Name, t.Field(i).Type, t.Field(i).Tag.Get("json"))
    }

    method := t.NumMethod()
    fmt.Println("methodcount:", method)
    for i := 0; i < method; i++ {
        fmt.Println(t.Method(i).Name)
    }
    //注意,当使用SetInfo方法时候,传入的必须是指针类型,否则会报错
    val := reflect.ValueOf(&p)
    call := val.MethodByName("GetInfo").Call(nil)
    fmt.Println(call)
    var params []reflect.Value
    params = append(params, reflect.ValueOf("java0904"))
    params = append(params, reflect.ValueOf(23))
    params = append(params, reflect.ValueOf("苏州市工业园区"))
    val.MethodByName("SetInfo").Call(params)
    call = val.MethodByName("GetInfo").Call(nil)
    fmt.Println(call)
    fmt.Println(p)

}

原文链接:https://www.sdk.cn/details/m1RMx6MZwxVWbYwWQo
SDK社区是一个中立的社区,这里有多样的前端知识,有丰富的api,有爱学习的人工智能开发者,有风趣幽默的开发者带你学python,还有未来火热的鸿蒙,当各种元素组合在一起,让我们一起脑洞大开共同打造专业、好玩、有价值的开发者社区,帮助开发者实现自我价值!

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
java中 什么是反射?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言(https://www.oschina.net/act
Wesley13 Wesley13
4年前
java中的反射和代理
  Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制。java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性。这些都是java的基础知识,要想成为一名合格的程序猿,必须掌握!Java反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知
Wesley13 Wesley13
4年前
java面试(反射)05
1.什么是反射JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类信息以及动态调用对象内容就称为java语言的反射机制。2.反射的作用在运行时判断任意一个对象所属的
Wesley13 Wesley13
4年前
java的反射机制
java中的反射可以将代码结构更加灵活,通过反射机制可以访问属性、方法和构造方法sun公司为我们提供的4大类反射:java.lang.reflect.methodjava.lang.Classjava.lang.reflect.modifierjava.lang.reflect.Constructor有以下几种方式:比如是Employ
lzy lzy
4年前
RPC框架手撕之路---java反射以及动态代理机制
在上一篇文章中,我们提到了,RPC框架所需要的java基础,第一点就是java的动态代理机制,动态代理机制的基础是反射,无论是在实际编程或者是面试时,都是java知识的重中之重。java反射:定义:在运行状态中,对于任意一个类,都能够知道这一个类的所有属性和方法,对于任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息以及动态调用类方法
Wesley13 Wesley13
4年前
Java反射技术概述
1.什么是Java反射?  就是正在运行,动态获取这个类的所有信息2.反射机制的作用  a.反编译:.class.java  b.通过反射机制,访问Java对象的属性,方法,构造方法等3.反射机制的应用场景  Jdbc加载驱动  SpringIOC实现  Java框架4.创建对象的两种方式  a.直
Wesley13 Wesley13
4年前
Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。一、反射反射机制是Java语言提供的一种基础功能,赋予程序在运行时<strong自省</strong(introspect,官方用语)的能力。通过反射我们可以直接
Wesley13 Wesley13
4年前
Java反射的使用姿势一览
反射的学习使用日常的学习工作中,可能用到反射的地方不太多,但看看一些优秀框架的源码,会发现基本上都离不开反射的使用;因此本篇博文将专注下如何使用本片博文布局如下:1.反射是什么,有什么用,可以做什么2.如何使用反射3.实例:利用反射方式,获取一个类的所有成员变量的
Wesley13 Wesley13
4年前
Java反射例子汇总 Class Constructor Method Filed
一、反射概述  在平常的开发中Java的反射技术很少被用到,一般我们都是使用公司封装或者开源框架。而反射技术已经被包含到底层框架了,因此我们很少接触到。但是有些框架的原理或者源码如果想读懂就必须要理解并会使用反射技术。例如:EventBus、BufferKnife、android的插件化等等都会用到。理解了反射技术能够帮助我们更快的理解相关框架,也可以增
Java反射源码学习之旅 | 京东云技术团队
在我刚开始了解反射这个Java特性的时候,几乎看到的每一篇文章都会有“Java反射不能频繁使用”、“反射影响性能”之类的话语,当时只是当一个结论记下了这些话,却没有深究过为什么,所以正好借此机会来探究一下Java反射的代码。
深入理解java反射机制及应用 | 京东物流技术团队
因为最近项目中经常有java反射的使用,而其中的IOC、动态代理用到了反射,因此趁这个机会来总结一下关于Java反射的一些知识,复习一下。本篇基于JDK1.8。java反射机制是什么反射原理Java反射机制(JavaReflection)是Java的特征之
数据市
数据市
Lv1
折得一枝香在手,人间应未有。
文章
2
粉丝
0
获赞
0