总结:

1. go语言支持反射即reflect,核心包括两方面:类型(reflect.Type)、值(reflect.Value)

2. reflect  可以获取到变量、结构体的类型和值

3. reflect 可以根据类型(reflect.Type)新产生一个对象

实验如下图

代码如下:

package mainimport ("fmt""reflect"
)// 自定义结构体
type User struct {ID   int32Name string
}
func (u User) GetName() string {return u.Name
}// 接口:人
type Person interface {GetHP() int32
}
// 男人
type Man struct {
}
func (m Man) GetHP() int32 {return 100
}
// 女人
type Woman struct {
}
func (w Woman) GetHP() int32 {return 200
}func main() {基本类型      //fmt.Println("整形")var a int = 555fmt.Println(reflect.TypeOf(a))fmt.Println(reflect.ValueOf(a)) // Valueof()就是取变量的值fmt.Println("")fmt.Println("字符串")fmt.Println(reflect.TypeOf("999"))fmt.Println(reflect.ValueOf("999")) // Valueof()就是取变量的值fmt.Println("")fmt.Println("数组")arr := []int32{1, 2, 3}fmt.Println(reflect.TypeOf(arr))fmt.Println(reflect.ValueOf(arr)) // Valueof()就是取变量的值fmt.Println("")自定义结构体     //fmt.Println("自定义结构体")// 自定义结构体user1 := User{}fmt.Println(reflect.TypeOf(user1))fmt.Println(reflect.ValueOf(user1))// 根据类型new一个结构体, 步骤如下// 1. 得到类型reflect.Type// 2. 根据类型new一个reflect.Value,再转为Interface// 3. Interface转为相应的对象指针userTy := reflect.TypeOf(user1)newInterface := reflect.New(userTy).Interface()newUser := newInterface.(*User)newUser.ID = 123newUser.Name = "123"fmt.Printf("根据reflect.Type新建的User对象内容:%v", newUser)// 自定义结构体的函数fmt.Println(reflect.TypeOf(user1).MethodByName("GetName"))  // 返回该函数的形式fmt.Println(reflect.ValueOf(user1).MethodByName("GetName")) // 返回该函数在内存中的真实地址fmt.Println("")接口   //fmt.Println("自定义结构体")man := Man{}fmt.Println(reflect.TypeOf(man))  // 返回该结构体定义的名字fmt.Println(reflect.ValueOf(man)) // 返回{}fmt.Println("")// 根据类型新建一个Woman对象womanTy := reflect.TypeOf(Woman{}) // 这里是根据一个空的Woman对象,得到其类型newWomanInterface := reflect.New(womanTy).Interface()newWoman := newWomanInterface.(*Woman)fmt.Printf("根据reflect.Type新建的newWoman对象内容:%v", newWoman)fmt.Println("")
}

go reflect的用法相关推荐

  1. Reflect的用法赶紧学起来

    Reflect 文章目录 Reflect 前言 为什么用 它主要有以下几个特点: 总结 前言 Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法.这些方法与 proxy的方 ...

  2. ThreadLocal用法详解和原理

    转载自 https://blog.csdn.net/danengbinggan33/article/details/73105838 一.用法 ThreadLocal用于保存某个线程共享变量:对于同一 ...

  3. threadlocal内存泄露_ThreadLocal用法详解和原理

    一.用法 ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量. 1.Thr ...

  4. 从0开始手把手带你入门Vue3-全网最全(1.1w字)

    天命不足畏,祖宗不足法. --王安石 前言 本文并非标题党,而是实实在在的硬核文章,如果有想要学习Vue3的网友,可以大致的浏览一下本文,总体来说本篇博客涵盖了Vue3中绝大部分内容,包含常用的Com ...

  5. 8小时快速入门,golang安装学习,有语言基础的快来学习

    安装golang(Linux环境) # 下载linux源码包中文官网地址 https://studygolang.com/dl # 下载命令直接下载 wget https://studygolang. ...

  6. 前端经典面试题汇总及部分答案

    迫于生计,奔波于各个公司,只为寻找一份称心的工作,且随手记一下遇见的各种坎坷吧~~ 内容不是全部问题,仅记录具有代表性的问题. 愿你被生活诚心以待.持续更新中- 腾讯面试 [Q]tcp三次握手四次挥手 ...

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

    [TOC] Golang的反射reflect深入理解和示例 [记录于2018年2月] 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机 ...

  8. ES6 之Reflect 与 Proxy概述

    Proxy 与 Reflect 是 ES6 为了操作对象引入的 API .Proxy 可以对目标对象的读取.函数调用等操作进行拦截,然后进行操作处理. 概述 Proxy 与 Reflect 是 ES6 ...

  9. 重温ES6核心概念和基本用法

    ES6在2015年6月就得以批准,至今已两年了.近一年多以来陆续看过很多ES6的资料,工作项目中也逐步的用上了很多ES6的特性(let,const,promise,Template strings,C ...

最新文章

  1. 减少企业Web威胁的三条预防性措施
  2. 使用 RUP 管理小型项目和团队
  3. 在中国使用pip更新或安装库的配置
  4. 树莓派Linux内核源码配置、编译、挂载(boot/kernal/根文件)、开启新内核
  5. Redis启动的三种方式
  6. 想入职AI算法岗?BAT的工程师去学了这门课
  7. ffmpeg 静态库使用,undefined reference错误
  8. 微软再次强调:爱开发 爱 Linux!
  9. Git 拉取开发环境代码,合并到自己分支,提交自己分支
  10. grads插值_GrADS中填色标尺cbarn用法
  11. macOS 工具 - 查看PKG文件内容:SuspiciousPackage 使用方法
  12. 大小写字母c语言,C语言 大小写字母转换
  13. 上海宝付发布新骗局预警:培训贷为大学生求职者而来
  14. 单词快速记忆day 1
  15. 期货市场倒挂什么意思(期货市场倒挂什么意思啊)
  16. 人工智能测试-人工智能质量工程技能简介
  17. Flex布局脑图总结
  18. 计算机视觉学习——投影与三维视觉——本征矩阵和基础矩阵
  19. 不熟悉的四级核心词汇(二)
  20. 全网最强下载神器IDM使用教程:如何利用IDM加速下载百度网盘大文件

热门文章

  1. 精通Android3笔记--第四章
  2. CodeForces - 1303E Erase Subsequences(dp)
  3. python安装后无法运行任何软件_为啥我按照python安装教程,总说无法启动此程序,因为计算机中丢失?...
  4. 微型计算机与裸机,第一章 微型计算机基础
  5. HDU4611(找循环节)
  6. BZOJ3209(n的二进制表示中1的个数的乘积)
  7. 透过汇编另眼看世界之多继承下的虚函数函数调用
  8. C++中Struct和Class的区别
  9. 如何使用Appverifier ?
  10. QUIC/HTTP2相关资料整理