非零基础自学Golang 第14章 反射 14.3 对结构体的反射操作

news2025/1/24 22:49:31

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第14章 反射
        • 14.3 对结构体的反射操作
          • 14.3.1 获取结构体成员类型
          • 14.3.2 获取结构体成员字段的值
          • 14.3.3 反射执行结构体方法

第14章 反射

14.3 对结构体的反射操作

反射不仅可以获取普通类型变量的值,还可以获取结构体成员的类型、成员变量的值以及调用结构体方法。

14.3.1 获取结构体成员类型

结构体通过reflect.TypeOf获取反射类型变量后,可以调用reflect.Type对象的NumField()方法获取结构体成员的数量,调用Field()则可以根据索引返回对应结构体字段的详细信息,具体信息如下:

type StructField struct {
 	Name string // 字段名
 	PkgPath string // 字段路径
 	Type Type // 字段反射类型对象
 	Tag StructTag // 字段结构体标签
 	Offset uintptr // 字段在结构体中的偏移
 	Index []int // 字段的索引值
 	Anonymous bool // 是否为匿名字段
}

reflect.Type中还可以使用FieldByName(name string)通过查找字段名来获取字段信息,以及使用FieldByIndex(index []int)通过索引值来获取字段信息。

[ 动手写 14.3.1 ]

package main

import (
   "fmt"
   "reflect"
)

type Person struct {
   Name string
   Age  int `json:"age"`
   string
}

func main() {

   person := Person{"小张", 10, "备注"}
   typeOfPerson := reflect.TypeOf(person)

   // 遍历所有结构体成员获取字段信息
   fmt.Println("遍历结构体")
   for i := 0; i < typeOfPerson.NumField(); i++ {
      field := typeOfPerson.Field(i)
      fmt.Printf("字段名: %v  字段标签: %v 是否是匿名字段: %v\n", field.Name, field.Tag, field.Anonymous)
   }

   // 通过字段名获取字段信息
   if field, ok := typeOfPerson.FieldByName("Age"); ok {
      fmt.Println("通过字段名")
      fmt.Printf("字段名: %v , 字段标签中json: %v \n ", field.Name, field.Tag.Get("json"))
   }

   // 通过下标获取字段信息
   field := typeOfPerson.FieldByIndex([]int{1})
   fmt.Println("通过下标")
   fmt.Printf("字段名: %v , 字段标签: %v \n", field.Name, field.Tag)
}

动手写14.3.1中创建了一个Person结构体,在main函数中使用Field(i)遍历获取所有字段信息,其中包括字段名、字段标签以及是否为匿名字段。

使用FieldByName()及FieldByIndex()函数获取Age字段的信息,运行结果如下:

在这里插入图片描述

【提示】

当我们创建结构体时,字段可以只有类型,而没有字段名,这样的字段称为匿名字段(Anonymous Field)。

14.3.2 获取结构体成员字段的值

获取结构体成员的值,我们仍需要使用reflect.ValueOf()方法获取到reflect.Value对象,使用对象的NumField()方法可以获取结构体成员的数量,使用Field()则可以根据索引返回对应结构体字段的reflect.Value反射值类型。

[ 动手写 14.3.2]

package main

import (
   "fmt"
   "reflect"
)

type Person struct {
   Name string
   Age  int `json:"age"`
   string
}

func main() {

   person := Person{"小张", 10, "备注"}
   ValueOfPerson := reflect.ValueOf(person)

   fmt.Printf("person 的字段数是: %v \n", ValueOfPerson.NumField())

   // 通过下标访问获取字段值
   fmt.Println("Field")
   field := ValueOfPerson.Field(1)
   fmt.Printf("字段值: %v \n", field.Int())

   // 通过字段名获取字段值
   field = ValueOfPerson.FieldByName("Age")
   fmt.Println("FieldByName")
   fmt.Printf("字段值: %v \n", field.Interface())

   // 通过下标索引获取字段值
   field = ValueOfPerson.FieldByIndex([]int{0})
   fmt.Println("FieldByIndex")
   fmt.Printf("字段值: %v \n", field.Interface())
}

动手写14.3.2对Person结构体变量分别使用Field()、FieldByName()、FieldByIndex()三个方法来获取结构体成员的值类型对象,并打印输出变量的值,运行结果如下:

在这里插入图片描述

14.3.3 反射执行结构体方法

对于结构体方法,需要使用reflect.ValueOf()获取reflect.Value对象,然后调用该对象的MethodByName(Name)函数,找到想要反射调用的方法,再通过Call函数进行反射调用。

[ 动手写 14.3.3]

package main

import (
   "fmt"
   "reflect"
)

type Person struct {
   Name string
   Age  int `json:"age"`
   string
}

func (p Person) GetName() {
   fmt.Println(p.Name)
}

func main() {

   person := Person{"小张", 10, "备注"}
   valueOfPerson := reflect.ValueOf(person)

   // 根据名字获取方法
   f := valueOfPerson.MethodByName("GetName")

   // 执行结构体方法
   f.Call([]reflect.Value{})
}

运行结果:

在这里插入图片描述

没毛病。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中钢矿院冲刺科创板:上半年营收4亿 拟募资5.54亿

雷递网 雷建平 12月20日中钢集团马鞍山矿山研究总院股份有限公司&#xff08;简称&#xff1a;“中钢矿院”&#xff09;日前递交招股书&#xff0c;准备在科创板上市。中钢矿院计划募资5.54亿元&#xff0c;其中&#xff0c;1.41亿元用于国家级研发平台研发能力提升与矿产资源…

Python图像处理【5】图像扭曲与逆扭曲详解

图像扭曲与逆扭曲详解0. 前言1. 使用 scikit-image warp() 函数执行图像变换1.1 scikit-image warp() 函数原理1.2 利用 warp() 函数实现图像变换2. 漩涡变换详解2.1 旋涡变换原理2.2 使用 scikit-image warp() 实现旋涡变换2.3 使用 scipy.ndimage 实现漩涡变换3. 使用 scikit…

如何抓住2023年技术创新的浪潮和趋势?

编辑 | 阿冒 设计 | 沐由千百年以来&#xff0c;技术的进步始终与人类社会的发展紧密相连&#xff0c;每一次重大的技术变革均对社会带来的深刻而持久的影响。最近半个世纪以来的表征&#xff0c;尤其明显。数字技术&#xff0c;正在以其“春风化雨”的姿态滋润着万物&#…

界面组件DevExpress v22.2官宣发布——正式支持.NET 7

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具&#xff0c;该组件拥有众多新产品和数十个具有高影响力的功能&#xff0c;可为桌面、Web和移动应…

最新系统MacOs13 Ventura(M1/M2芯片) + Parallels Desktop 18(PD18史上最强虚拟机)永久使用攻略

众神殿内&#xff0c;高朋满座&#xff0c;胜友如云&#xff0c;Vmware、VirtualBox、Utm等虚拟机大神群英荟萃&#xff0c;只见位于C位王座上的Parallels怅惘抬头&#xff0c;缓缓逡巡&#xff0c;睥睨群小&#xff0c;目光到处&#xff0c;无人敢抬头对视。 是的&#xff0c…

网络空间安全中高职业院校职技能大赛——借助.htaccess上传绕过

1.选择pass-04 查看源码发现 .php .php5 …这些文件都不能上传 2.修改一句话木马为a.jpg 3.新建.htaccess文件&#xff0c;内容如下 上传.htaccess 编辑菜刀去连接&#xff0c;取得shell

C++数学与算法系列之初等数论

1. 数 什么是数&#xff1f; 一个用作计数、标记或用作量度的抽象概念。 代表数的一系列符号&#xff0c;包括数字、运算符号等统称为记数系统。 在日常生活中&#xff0c;数通常出现在标记&#xff08;如公路、电话和门牌号码&#xff09;、序列号和编码上。在数学里&…

一年后,那个残酷的 Log4j 漏洞仍然潜伏

©网络研究院 一年前&#xff0c;随着俄罗斯在其与乌克兰的边境集结军队以及Covid-19 Omicron 变种开始在全球范围内激增&#xff0c;Apache 软件基金会披露了一个漏洞&#xff0c;在全球科技行业掀起了一阵狂热。 该错误称为 Log4Shell&#xff0c;在无处不在的开源日志…

《MySQL系列-主从相关》Docker安装MySQL,实现主从复制

Docker安装MySQL&#xff0c;实现主从复制 一、前言 1 Docker安装MySQL 参考历史文章Docker安装MySQL&#xff0c;准备两台MySQL容器 master节点 容器名称 MySQL01 容器ID faf2312fd62a 端口 33061 slave节点 容器名称 MySQL01 容器ID dfc693c2bb04 端口 33062 2 M…

【Numpy基础知识】Datatypes数据类型

Numpy 数据类型 来源&#xff1a;Numpy官网&#xff1a;https://numpy.org/doc/stable/user/basics.html 文章目录Numpy 数据类型导包【1】数组类型和类型之间的转换【2】数组标量【3】溢出错误【4】扩展精度导包 import numpy as np【1】数组类型和类型之间的转换 NumPy支持…

弃购频频发生?跨境电商卖家必知的弃购原因以及解决方案!

关键词&#xff1a;弃购、跨境电商卖家 电子商务商店平均有 75% 的销售额因数字购物车放弃而损失。 本文分解了放弃购物车的主要原因&#xff08;以及如何预防&#xff09;。 放弃购物车的十大原因 放弃购物车是一个问题。正如我们在介绍中分享的那样&#xff0c;据估计&#…

使用css3实现一个超浪漫的新年倒计时

新年快到了&#xff0c;使用css3实现一个超浪漫的新年倒计时吧&#xff0c;希望大家喜欢。 目录 1 实现思路 2 实现浪漫的心形背景 3 布局小时分钟和秒的区域 4、js倒计时 5、然后就是将所得的小时、分钟、秒对DOM进行赋值 6、每秒一更新 7、补充知识点1- 倒计时为什…

爆款微信小游戏,你都知道几款?

紧随微信2017年上线小程序平台&#xff0c;11月份便开始向各大小游戏厂商发送邀请函开发微信小游戏。2017年12月28日&#xff0c;微信正式对外开放微信小游戏。 就微信小游戏来说&#xff0c;其开发者数量在今年已经超过10万人&#xff1b;而产品方面除了《跳一跳》《羊了个羊…

全网首次揭秘:微秒级“复活”网络的HARP协议及其关键技术

导读&#xff5c;云计算时代&#xff0c;承担服务器之间数据传输工作的交换机成了数据中心的“神经枢纽”&#xff0c;一旦出故障将波及上层业务。然而单个交换机故障时&#xff0c;腾讯云的新一代高性能网络却可以在100微秒内找到新的通路实现0断链&#xff0c;做到高可用、高…

基于springboot layui疫苗接种信息管理系统源码

开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;springboot layui 伴随着社会的迅速发展&#xff0c;电子计算机对世界的作用影响是全面并且长久的。人们日常生活消费综合应用水平的持续增高&#xff0c;生活中人…

[ 数据结构 -- 手撕排序算法总结篇 ]

文章目录前言一、常见的排序算法二、测试排序的性能对比随机数排序时间对比有序数排序时间对比三、排序算法的复杂度四、排序算法的稳定性前言 手撕排序算法总结 本篇文章进行总结&#xff0c;我会对比并分析常见的几种排序&#xff0c;例如像插入排序&#xff0c;冒泡排序&am…

【金猿案例展】福特电马——一键五联私域流量运营

‍映盛中国案例本项目案例由映盛中国投递并参与“数据猿年度金猿策划活动——《2022大数据产业年度创新服务企业》榜单/奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业随着中国电动车市场及消费者对电动汽车的需求的不断变化&#xff0c;汽车市场进入存量竞争时…

如何用VS2010创建并生成动态链接库

1、目的 在某些应用程序场景下&#xff0c;需要将一些类或者方法编译成动态链接库dll&#xff0c;以便别的.exe或者.dll文件可以通过第三方库的方式进行调用&#xff0c;下面就简单介绍一下如何通过VS2010来创建动态链接库。 2、新建动态链接库 1&#xff09; 打开VS2010&…

546103-85-9,PR-AMC,二肽标记肽

PR-AMC, a fluorogenic Plasmodium falciparum dipeptidyl aminopeptidase 1 (DPAP1, cathepsin C) substrate.一种含氟恶性疟原虫二肽基氨基肽酶1 (DPAP1&#xff0c;组织蛋白酶C)底物。编号: 177167 中文名称: 二肽标记肽PR-7-氨基-4-甲基香豆素2HCl英文名: H-Pro-Arg-AMCCAS…

clickhouse 数据字典使用详解

一、数据字典介绍 数据字典是ClickHouse提供一种非常简单且实用的存储媒介&#xff0c;他以键值和属性映射的形式定义数据。字典中的数据会主动或被动加载到内存并支持动态更新。由于字典数据常驻内存的特性&#xff0c;所以非常适合保存常量或经常使用的维度表数据&#xff0c…