go 反射

2023-11-16


反射

  • reflect
  • 反射可以在运行时动态获取变量/实例的各种信息,例如:变量的类型;
  • 如果是结构体变量,反射还可以获取到结构体本身的信息(结构体的字段、方法等);
  • 通过反射可以修改变量的值,可以调用关联的方法;

反射的相关函数

  • relect.TypeOf(变量名): 获取变量的类型,返回 reflect.Type 类型;
  • relect.ValueOf(变量名): 获取变量的值,返回 reflect.Value 类型; reflect.Value是一个结构体类型,通过 reflect.Value 可以获取到关于该变量的很多信息;
  • reflect.Value 需要调用具体类型的方法, 获取转换类型后的值,例如:val.Int();具体类型使用断言判断;
  • func (v Value) Interface() (i interface{}) : 此函数将 reflect.Value 转换成空接口;借助断言判断并转换成真实类型;
type Type
    func TypeOf(i interface{
   }) Type
    func PtrTo(t Type) Type
    func SliceOf(t Type) Type
    func MapOf(key, elem Type) Type
    func ChanOf(dir ChanDir, t Type) Type
type Value
    func ValueOf(i interface{
   }) Value
    ...

基本数据类型的反射

  • 借助空接口 进行转换;
  • 使用reflect.Value.Int() 转换成真实类型;
  • 使用reflect.Value.Interface() + 断言,判断类型并转换成真实类型,进行后续操作;

反射设置变量值

  • 需要传入地址;
  • 使用Elem()reVal.Elem().SetInt(19);

结构体类型的反射

  • 结构体反射使用空接口即可,别的操作类似;

反射操作结构体的属性和方法

  • field := val.NumField();/val.Field(i), 输出:NumField 字段个数;Field类似于java 的字段数组;
  • 字段修改,传参时需要传入指针;此时操作Field 需要加 reflect.ValueOf().Elem().Field(0), Elem 相当于解地址;
  • 字段修改使用:val.Elem().Field(0).SetString("xxx")/ SetInt(18) , 字段也按结构体的定义先后排序;
  • 方法调用:val.Method(2).Call(nil); val.MethodByName("Print").Call(nil); 方法首字母必须大写才有对应的反射的访问权限;
  • 方法顺序 按照 ASCII 码的顺序排列,使用 val.Method(2).Call(nil) 时传入的2/索引值,需要用到;
  • 调用带参数方法,入参要使用[]reflect.Value + append 构造切片;具体看示例代码;

反射获取变量的类别

  • reflect.Type.Kind()
  • reflect.Value.Kind():
  • Kind:
type Kind uint
Kind代表Type类型值表示的具体分类。零值表示非法分类。

const (
    Invalid Kind = iota
    Bool
    Int
    Int8
    Int16
    Int32
    Int64
    Uint
    Uint8
    Uint16
    Uint32
    Uint64
    Uintptr
    Float32
    Float64
    Complex64
    Complex128
    Array
    Chan
    Func
    Interface
    Map
    Ptr
    Slice
    String
    Struct
    UnsafePointer
)

示例代码

package main

import (
	"fmt"
	"reflect"
)

// 函数参数定义为空接口,可接收任何类型的数据
func baseTypeReflect(i interface{
   })  {
   

	reType := reflect.TypeOf(i)
	fmt.Println("type(reflect.Type 类型)=", reType)
	val := reflect.ValueOf(i)
	fmt.Println("value(reflect.Value 类型)=", val)

	num2 := 10 + val.Int()
	fmt.Println("num2=", num2)

	fmt.Println("==>> reflect.Value 转换成空接口,再借助断言转换+判断:")
	valIface := val.Interface()
	valInt, ok := valIface.(int)
	if ok {
   
		n2 := valInt +1
		fmt.Println("(valInt )=", valInt)
		fmt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go 反射 的相关文章

  • golang中默认的HTTP拨号超时值

    我正在运行 golang http 客户端来对服务器进行压力测试 有时我会收到错误 拨号 tcp 161 170 xx xxx 80 操作超时 错误 我认为这是 HTTP 客户端超时 我正在考虑增加超时值https stackoverflo
  • Goroutine 是如何工作的? (或者:goroutines 和操作系统线程的关系)

    其他 goroutine 如何在调用系统调用时继续执行 当使用 GOMAXPROCS 1 时 据我所知 当调用系统调用时 线程会放弃控制权 直到系统调用返回 Go 如何在不为每个阻塞系统调用 goroutine 创建系统线程的情况下实现这种
  • Golang 从管道读取读取大量数据

    我正在尝试读取一个正在被焦油化 流式传输到标准输入的存档 但我正在以某种方式读取far管道中的数据多于 tar 发送的数据 我像这样运行我的命令 tar cf somefolder my go binary 源代码是这样的 package
  • 无法从另一个标签的源代码构建和安装 go

    我正在尝试使用此从源代码构建和安装 go文档 https go dev doc install source 当我喜欢以下内容时 这效果很好 git clone https go googlesource com go goroot cd
  • Google App Engine Golang 没有这样的文件或目录

    我正在用 Go 开发一个 Google App Engine 项目 并陷入了读取文件的困境 事实上 应用程序在本地运行得很好 然而 部署时 它会恐慌告诉我没有这样的文件或目录 这是我的 fileValue 方法 func fileValue
  • 数据库连接最佳实践

    我有一个使用 net http 的应用程序 我使用 http 注册了一些处理程序 这些处理程序需要从数据库中获取一些内容 然后才能继续编写响应并完成请求 我的问题是连接到该数据库的最佳实践是什么 我希望它能够以每分钟 1 个请求或每秒 10
  • 如何自定义解析错误的 HTTP 400 响应?

    我编写了一个 REST API 服务 要求所有响应均为 JSON 但是 当 Go HTTP 请求解析器遇到错误时 它会返回 400 作为纯文本响应 而不会调用我的处理程序 例子 gt curl i H Authorization Basic
  • Go MSSQL 连接

    如何提供 MSSQL 连接 它说它始终与代码相关 即使信息不正确 也不会报错 package main import database sql fmt github com denisenkom go mssqldb log var ser
  • 如何在 Goji (Golang) 中使用不同的中间件创建单独的路由组?

    我正在使用Goji https github com zenazn goji https github com zenazn goji 并希望定义具有自己的中间件的路由组 例如 下面的所有路径 company应使用 LDAP 身份验证并定义
  • 给定方法值,获取接收者对象

    Go 有没有办法从方法值获取接收者对象 例如有没有这样的MagicFunc这将使以下程序输出字符串my info来自底层 Foo 实例 package main import fmt type Foo struct A string fun
  • 是否支持动态变量?

    我想知道Go中是否可以动态创建变量 我在下面提供了一个伪代码来说明我的意思 我将新创建的变量存储在切片中 func method slice make type for i 0 i lt 10 i var variable i i slic
  • Golang 按位运算以及一般字节操作

    我有一些 C 代码 可以对字节执行一些按位运算 我正在尝试在 golang 中做同样的事情 但遇到了困难 C 中的示例 byte a c byte data int j c data j c byte c j c a c 0xFF c 0x
  • nsq 无法通过连接到 nsqlookupd 来消费消息

    我尝试使用 docker compose 来运行 nsq docker compose yml如下 version 3 services nsqlookupd image nsqio nsq command nsqlookupd ports
  • 完全删除使用“go get”安装的软件包?

    我正在使用 Go 1 13 1 最新版本 我正在尝试完全删除我安装的软件包go get来自 GitHub 这go clean i
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • 错误“binary.Write:无效类型”是什么意思?

    下面显示的代码 我创建了一个结构类型并希望将其编码为二进制 但它显示binary Write invalid type main Stu错误 我读过一些类似的代码 但我找不到为什么我的代码不起作用 type Stu struct Name
  • 为什么 Go 中只有 int 而没有 float?

    在 Go 中 有这样的类型int这可能相当于int32 or int64取决于系统架构 我可以声明一个整数变量而不用担心它的大小 var x int 为什么没有这个类型float 这相当于float32 or float64取决于我的系统架
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • 编写每个处理程序中间件

    我希望从处理程序中提取一些重复的逻辑 并将其放入一些每个处理程序的中间件中 特别是 CSRF 检查 检查现有会话值 即身份验证或预览页面 等 我读了关于此的几篇文章 http justinas org writing http middle
  • 如何在 Ubuntu 中将 Go 程序作为守护进程启动?

    在 Ubuntu 中将 Go 程序作为守护进程启动的正确方法是什么 然后我将使用 Monit 对其进行监控 我应该做这样的事情 go run myapp go 我应该考虑 Go 特有的事情吗 您应该为您的程序构建一个可执行文件 go bui

随机推荐

  • 西门子变频器SINAMICS S120电源模块分享

    西门子变频器SINAMICS S120系列 在工业领域中能胜任各种要求严格的驱动控制任务 为用户提供简单有效的驱动控制过程 西门子变频器SINAMICS S120系列可以配置电源模块 来为西门子变频器驱动控制系统提供稳定的电源保障 本文下面
  • 设计模式-模板方法

    文章目录 前言 模板方法模式简介 Java代码示例 模板方法使用场景 模板方法使用场景 前言 当我们需要在一个算法的框架中定义算法的骨架 并将一些步骤的具体实现留给子类来完成时 模板方法模式是一种非常有用的设计模式 这篇博客将介绍模板方法模
  • install.packages(“hgu133a.db“)报错——解决办法

    问题描述 install packages hgu133a db WARNING Rtools is required to build R packages but is not currently installed Please do
  • Sqli-Labs Less1-16关详细讲解

    Sqli Labs Less1 16关详细讲解 一 首先介绍一下这个重要的数据库 information schema数据库 二 Sqli Labs靶场 Get传输方式 Less 1 Union Select注入 闭合符 Less 5 报错
  • freertos中空闲任务函数prvIdleTask()详解

    The Idle task 空闲任务函数 The portTASK FUNCTION macro is used to allow port compiler specific language extensions The equival
  • Verilog开源项目——百兆以太网交换机(一)架构设计与Feature定义

    Verilog开源项目 百兆以太网交换机 一 架构设计与Feature定义 声明 未经作者允许 禁止转载 博主主页 王 嘻嘻的CSDN主页 全新原创以太网交换机项目 Blog内容将聚焦整体架构 模块设计方面 更新周期可能会略慢 希望朋友们多
  • 树状数组详解

    Markdown版本 请点击这个链接 树状数组 Markdown版本 xiji333的博客 CSDN博客 什么是树状数组 树状数组 Binary Indexed Tree B I T Fenwick Tree 是一个查询和修改复杂度都为lo
  • Android中当数据库需要更新时我们该怎么办?

    问题 Android数据库更新并保留原来的数据如何实现 Andoird的SQLiteOpenHelper类中有一个onUpgrade方法 帮助文档中只是说当数据库升级时该方法被触发 经过实践 解决了我一连串的 疑问 1 帮助文档里说的 数据
  • Linux系统shell脚本之批量修改服务器密码

    Linux系统shell脚本之批量修改服务器密码 一 脚本要求 二 脚本内容 三 编辑原始旧密码 四 执行脚本 五 验证密码更改 1 查看更改后的密码文件 2 在远端服务器验证密码 一 脚本要求 可以批量修改服务器的密码 二 脚本内容 bi
  • 【机器学习】机器学习回归模型的最全总结!

    导读 大家好 我是泳鱼 一个乐于探索和分享AI知识的码农 回归分析为许多机器学习算法提供了坚实的基础 在这篇文章中 我们将介绍回归分析概念 7种重要的回归模型 10 个重要的回归问题和5个评价指标 什么是回归分析 回归分析是一种预测性的建模
  • Linux系统与管理 - (六)用户与组❤

    自说 学习路径 用户管理 用户管理命令 组管理 组管理命令 目录和文件的权限 自说 在Windos系统中 用户的概念我们并不陌生 它是一种身份也是一种权限 不同的用户也相应有着不同的使用 下面细说下Linux中的用户与组 学习路径 Linu
  • windows上nacos自启动的三种方法

    前提 windows上先安装nacos 备注 方法一 二都是以 windows服务 形式进行自启动 效果类似于mysql的windows服务 但这种方法nacos服务可能会启动失败 不想浪费时间的博主建议直接跳转方法三 跟nacos自启动死
  • 初级java工程师笔试题

    最近面试很头疼 因为满以为自己工作了1年多了 实际coding经验却压缩到不到1年 每每被面试官 痛扁 心里特别不痛快 总以为我能给你交活不就完了吗有必要在基础上为难我吗 相信大多数不会总结 在面试中屡屡受挫的小伙伴你也是差不多的吧 因为没
  • 邮AI——AI陪你“邮”笑邮语!

    亲爱的小伙伴们 你是否有过写邮件的时候 脑袋一片空白 就像忘记刷牙一样让人尴尬 别担心 因为有一个 邮 到了幽默智能的解决方案 邮AI 它不仅能帮你写邮件 还能陪你 邮 笑邮语 邮AI 顶级AI大脑 不只是靠模板搞笑 它是真正的幽默高手 从
  • Altium Designer借助嘉立创添加PCB封装和3D模型

    目录 引言 打开立创专业版EDA 建立项目 从立创商城找到器件编码 添加PCB封装 导出和修改3D封装 引言 由于使用Altium Designer的频率并不是特别高 所以每一次使用总是得东跌西撞的才回忆起一些使用步骤 因此 想在这里记录一
  • 【PyTorch】语言模型/Language model

    1 模型描述 1 语言模型的定义 来自于维基百科 统计式的语言模型是一个几率分布 语言模型提供上下文来区分听起来相似的单词和短语 例如 短语 再给我两份葱 让我把记忆煎成饼 和 再给我两分钟 让我把记忆结成冰 听起来相似 但意思不同 语言模
  • 移动端浏览器兼容性问题

    在开发移动端商城项目的时候 在实现功能和处理bug的过程中出现了一些之前没有见过的问题 在这里记录一下 1 IOS移动端click事件300ms的延迟响应 移动设备上的web网页是有300ms延迟的 玩玩会形成按钮点击延迟甚至是点击失效 这
  • linux查看mysql表空间使用率_查看表空间使用率sql

    10G进asm 直接su oracle 然后asmcmd 11G进asm 需要su grid 然后asmcmd 1 切换到相关oracle数据库实例下 echo ORACLE SID 查看当前数据库实例 或者进入sql下执行 select
  • 【Visual C++】游戏开发笔记二十二 游戏基础物理建模(四) 粒子系统模拟(一)

    本系列文章由zhmxy555 毛星云 编写 转载请注明出处 http blog csdn net zhmxy555 article details 7585937 作者 毛星云 邮箱 happylifemxy qq com 期待着与志同道合
  • go 反射

    文章目录 反射 反射的相关函数 基本数据类型的反射 反射设置变量值 结构体类型的反射 反射操作结构体的属性和方法 反射获取变量的类别 示例代码 运行结果 反射 包 reflect 反射可以在运行时动态获取变量 实例的各种信息 例如 变量的类