首页 > 其他分享 >反射

反射

时间:2022-08-29 20:13:32浏览次数:50  
标签:反射 fmt Book func pair main type

image-20220829192226908

package main

import "fmt"

func main() {

   var a string
   //pair<statictype:string, value:"aceld">
   a = "aceld"

   //pair<type:string, value:"aceld">
   var allType interface{}
   allType = a

   str, _ := allType.(string)
   fmt.Println(str)
}
package main

import (
   "fmt"
   "io"
   "os"
)

func main() {
   //tty: pair<type:*os.File, value:"/dev/tty"文件描述符>
   tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)

   if err != nil {
      fmt.Println("open file error", err)
      return
   }

   //r: pair<type:  , value:>
   var r io.Reader
   //r: pair<type:*os.File, value:"/dev/tty"文件描述符>
   r = tty

   //w: pair<type:  , value:>
   var w io.Writer
   //w: pair<type:*os.File, value:"/dev/tty"文件描述符>
   w = r.(io.Writer)

   w.Write([]byte("HELLO THIS is A TEST!!!\n"))
}
package main

import "fmt"

type Reader interface {
   ReadBook()
}

type Writer interface {
   WriteBook()
}

//具体类型
type Book struct {
}

func (this *Book) ReadBook() {
   fmt.Println("Read a Book")
}

func (this *Book) WriteBook() {
   fmt.Println("Write a Book")
}

func main() {
   //b: pair<type:Book, value:book{}地址>
   b := &Book{}

   //r: pair<type:, value:>
   var r Reader
   //r: pair<type:Book, value:book{}地址>
   r = b

   r.ReadBook()

   var w Writer
   //r: pair<type:Book, value:book{}地址>
   w = r.(Writer) //此处的断言为什么会成功? 因为w r 具体的type是一致

   w.WriteBook()
}
package main

import "fmt"

type Reader interface {
   ReadBook()
}

type Writer interface {
   WriteBook()
}

//具体类型
type Book struct {
}

func (this *Book) ReadBook() {
   fmt.Println("Read a Book")
}

func (this *Book) WriteBook() {
   fmt.Println("Write a Book")
}

func main() {
   //b: pair<type:Book, value:book{}地址>
   b := &Book{}

   //r: pair<type:, value:>
   var r Reader
   //r: pair<type:Book, value:book{}地址>
   r = b

   r.ReadBook()

   var w Writer
   //r: pair<type:Book, value:book{}地址>
   w = r.(Writer) //此处的断言为什么会成功? 因为w r 具体的type是一致

   w.WriteBook()
}
package main

import (
   "fmt"
   "reflect"
)

type User struct {
   Id   int
   Name string
   Age  int
}

func (this *User) Call() {
   fmt.Println("user is called ..")
   fmt.Printf("%v\n", this)
}

func main() {
   user := User{1, "Aceld", 18}

   DoFiledAndMethod(user)
}

func DoFiledAndMethod(input interface{}) {
   //获取input的type
   inputType := reflect.TypeOf(input)
   fmt.Println("inputType is :", inputType.Name())
   fmt.Println("inputType is :", inputType)
   //获取input的value
   inputValue := reflect.ValueOf(input)
   fmt.Println("inputValue is:", inputValue)

   //通过type 获取里面的字段
   //1. 获取interface的reflect.Type,通过Type得到NumField ,进行遍历
   //2. 得到每个field,数据类型
   //3. 通过filed有一个Interface()方法等到 对应的value
   for i := 0; i < inputType.NumField(); i++ {
      field := inputType.Field(i)
      value := inputValue.Field(i).Interface()

      fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value)
   }
   fmt.Printf("--------------------------")
   //通过type 获取里面的方法,调用
   for i := 0; i < inputType.NumMethod(); i++ {
      m := inputType.Method(i)
      fmt.Printf("%s: %v\n", m.Name, m.Type)
   }

}

标签:反射,fmt,Book,func,pair,main,type
From: https://www.cnblogs.com/suehoo/p/16637187.html

相关文章

  • Java设计模式 - 反射机制
    Java设计模式-反射机制......
  • 自省与反射机制
    自省在日常生活中,自省(introspection)是一种自我检查行为。在计算机编程中,自省是指这种能力:检查对象以确定它是什么类型、它有哪些属性和哪些方法。自省向程序员提供了极大......
  • Golang 中反射的应用与理解
    Golang中反射的应用与理解https://mp.weixin.qq.com/s/TmzV2VTfkE8of2_zuKa0gAGolang中反射的应用与理解原创 赵燕辉 字节跳动技术团队 2022-08-2312:00 发表于......
  • 泛型的具体使用以及反射赋值
    泛型必须要有<T>不然编译报错TresponseDto,Class<T>tClass这个必须是同一个类传过来publicclassBindCardHelperTest{publicstaticvoidmain(String[]args)......
  • java反射技术的简单应用
    一.反射介绍java反射技术的应用广泛,能够对类的方法和参数进行配置,完成对象的初始化工作,增加了java的灵活性,SpringIOC也使用了反射技术,下文主要讲解对象的构建和方法的反射......
  • 反射
    反射一、介绍1.什么是反射反射就是把Java类中的__各个成分(构造器、属性和方法)映射成一个个的Java对象__,即在运行状态中:对于任意一个类,都能知道这个类的所有属性和方法......
  • 反射案例以及注解的概念
    反射案例需求:写一个"框架",可以帮我们创建任意类的对象,并且执行其中的任意方法实现:实现文件反射,步骤:将需要创建对象的全类名和需要......
  • 反射-Class对象功能获取Constructor以及Method
    Class对象功能_获取ConstructorConstructor构造方法:创建对象:TnewInstance(Object…initargs)如果使用空参数构造方法创建对象,操作可以简化:Class......
  • Java Servlet 入门:问题系列:反射方法参数名获取不到问题:arg0,arg1
    问题:获取反射的方法参数名时,得到arg0,arg1,而不是定义的参数名。示例代码:Parameter[]parameters=methodInfo.getParameters();if(parameters!=null&&parame......
  • 反射-Class对象功能概述以及获取Field
    Class对象功能概述1、获取成员变量们:Field[]getFields():获取所有public修饰的成员变量FieldgetField(Stringname):获取指定名称的public修饰的成员变量 Field[]g......