美文网首页
第11章 2.反射

第11章 2.反射

作者: yezide | 来源:发表于2020-01-18 16:45 被阅读0次

1、 方法和类型的反射

package main

import "fmt"
import "reflect"


func main() {
    var f1 float64 = 1.1
    var type1 reflect.Type
    type1 = reflect.TypeOf(f1)
    fmt.Println("type: ", type1)

    value1 := reflect.ValueOf(f1);
    fmt.Println("value1: ", value1)
    fmt.Println("value1's type: ", value1.Type())
    fmt.Println("value1's kind: ", value1.Kind())
    fmt.Println("value1's Interface: ", value1.Interface())

    // 下面我们将尝试用反射修改f1的值. 
    // 将会导致错误: panic: reflect: reflect.Value.SetFloat using unaddressable value
    // 因为v不可以设置
    // value1.SetFloat(2.2)

    // 要想设置, 要传入f1的指针地址, 再用Elem()
    // 好麻烦
    value2 := reflect.ValueOf(&f1)
    value2 = value2.Elem()
    value2.SetFloat(2.2)
    fmt.Println("value2: ", value2)
}

2、结构的反射

package main

import "fmt"
import "reflect"

type NotknownType struct {
    s1, s2, s3, S4 string
}

func (n NotknownType) String() string {
    return n.s1 + " - " + n.s2 + " - " + n.s3 + "-" + n.S4
}

// variable to investigate:
var secret1 interface{} = NotknownType{"str1", "str2", "str3", "Str4"}
type secret2 struct {
    Str string
}


func main() {
    type1 := reflect.TypeOf(secret1)
    value1 := reflect.ValueOf(secret1)

    fmt.Println("type: ", type1)
    fmt.Println("value: ", value1)
    fmt.Println("Kind: ", value1.Kind())

    // 看结构体中各个类型的字段
    for i := 0; i < value1.NumField(); i++ {
        field1 := value1.Field(i)
        fmt.Printf("before Field %d: value=%v kink=%v\n", i,field1, field1.Kind())
        // 此时如果想设置值会报错. 因为s1是非导出类型(可以理解为private的)
        // field1.SetString("1")
    }

    // 设置值, 有点绕
    s2 := secret2{"1"}
    value2 := reflect.ValueOf(&s2).Elem()
    value2.Field(0).SetString("2")
    fmt.Printf("value2=%s\n", value2)
}

相关文章

  • 第11章 2.反射

    1、 方法和类型的反射 2、结构的反射

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

  • java反射

    1.反射 2.反射获取类构造器结构

  • java反射机制小结

    本文主要从以下几个方面对java反射机制进行总结: 1. 反射的概念2.反射的作用3.反射主要类说明4.反射实例 ...

  • go语言反射的总结

    首先巴拉巴拉一下golang反射机制的三个定律 1.反射可以从接口类型到反射类型对象 2.反射可以从反射类型对象到...

  • 腹部也有调理腰痛的穴位吗?

    根据腹部全息反射区定位: 气海穴是第2、3腰椎反射区 气海穴旁开5分处即气旁穴,是第2、3腰椎旁反射区 关元穴是第...

  • java基础(一)反射注解泛型

    反射 1.反射拿到构造函数 2.通过构造去创建对象 3.反射获取属性修改属性 4.反射执行私有方法 注解 1.Re...

  • JAVA基础之反射

    1.通过反射获取类获取反射对象(反射入口):Class 1.Class.forName(全类名) 2.类名.cla...

  • Java获取反射的三种方法

    1.通过new对象实现反射机制 2.通过路径实现反射机制 3.通过类名实现反射机制 public class Ge...

  • 从Java到Kotlin(七)

    反射和注解 目录 1.反射1.1类引用1.2函数引用1.3属性引用 2.注解2.1声明注解2.2构造函数 1.反射...

网友评论

      本文标题:第11章 2.反射

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