美文网首页
golang:reflect反射

golang:reflect反射

作者: 唐僧取经 | 来源:发表于2018-09-07 17:36 被阅读0次

reflect反射

1.使用场景

当一些类型未知,有多种类型需要统一处理时,考虑使用反射来做多种情况的统一判断处理。

反射读取数据:

reflect常见类型

reflect.Int,reflect.Int8,reflect.Int16,reflect.Int32,reflect.Int64
    reflect.Uint,reflect.Uint8,reflect.Uint16,reflect.Uint32,reflect.Uint64,reflect.Uintptr
    reflect.Bool
    reflect.String
    reflect.Chan,reflect.Func,reflect.Ptr,reflect.Slice,reflect.Map,reflect.Array,reflect.Struct:
    reflect.Invalid
    reflect.Interface

reflect.TypeOf()

将一个具体的值,转为接口类型!返回具体的类型。

  • Type类型
注意格式输出时控制符
t:=reflect.TypeOf(3)
    fmt.Println(t.String())
    fmt.Printf("%s\n",t.String())
    fmt.Printf("%v\n",t)

  • Value类型
   x := 4

    v := reflect.ValueOf(x) //反射拿到Value类型
    fmt.Println(v)          //4

    t := v.Type()           //Value实现了各种方法
    fmt.Println(t.String()) //int

    v := reflect.ValueOf(3) //拿到Value类型到数据值,类型为Value
    fmt.Println(v)          //3
    fmt.Printf("%T", v)     //reflect.Value

    fmt.Println(v.Int()) //将Value类型转换成特定类型   //3

    x := v.Interface() //将Value转成接口类型
    i := x.(int)
    fmt.Printf("%T\n", i)
    m, ok := x.(int) //类型断言,取出其值 ,并转成断言的类型
    if !ok {
        fmt.Println("类型转换错误")
    }
    fmt.Printf("%d,%T", m, m) //3,int

  • value.Kind()只关心底层表示
var value interface{}
    fmt.Println(reflect.ValueOf(value).Kind()) //slice
    fmt.Println(reflect.TypeOf(value))         //[]int

反射修改数据

我们可以通过调用reflect.ValueOf(&x).Elem(),来获取任意变量x对应的可取地址的Value。

    x := 2
    d := reflect.ValueOf(&x).Elem()   // d refers to the variable x
    px := d.Addr().Interface().(*int) // px := &x
    *px = 3                           // x = 3
    fmt.Println(x)                    // "3"

慎用反射

  • 1.反射代码比较脆弱,不会在构建时报错,只有在真正运行的时候才会抛出Panic
  • 难读不易懂,不能做静态类型检查
  • 反射代码运行速度慢

Example

将Value类型转成interface

if _, ok := req.(reflect.Value); ok {
            req = req.(reflect.Value).Interface()
        }

判断比对interface类型:

    var req interface{}

    switch req.(type) {
    case int:
        fmt.Println("*")
    }
    

相关文章

  • Golang 反射实现依赖注入

    Golang 反射实现依赖注入 Coding/Golang #Golang #Golang/reflect 依赖注...

  • golang:reflect反射

    reflect反射 1.使用场景 当一些类型未知,有多种类型需要统一处理时,考虑使用反射来做多种情况的统一判断处理...

  • Golang反射reflect

    reflect反射,可以通过reflect反射结构体所包含的属性和方法,然后进行一些赋值和方法的调用,灵活度比较高...

  • Golang 反射的使用

    声明: 转载自golang reflect包,反射学习与实践[https://segmentfault.com/a...

  • golang reflect 反射包

    基础类型描述 Type Kindtype Kind uint 基础类型常量const ( Invalid K...

  • Golang的反射reflect深入理解和示例

    [TOC] Golang的反射reflect深入理解和示例 【记录于2018年2月】 编程语言中反射的概念 在计算...

  • ES6(十二)—— Reflect

    Reflect 反射,什么是反射机制? Reflect简介 为什么要用Reflect? Reflect API.a...

  • go 的反射 reflect

    Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的reflect包就是反射相关...

  • 关于反射

    Golang的反射reflect深入理解和示例 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够...

  • golang中的reflect(反射)

    一、概述 在golang中,reflect是一个比较高级的话题,本文将尽可能简单而又清楚的介绍相关内容。 本文将从...

网友评论

      本文标题:golang:reflect反射

      本文链接:https://www.haomeiwen.com/subject/csacgftx.html