非零基础自学Golang 第14章 反射 14.4 反射三定律

news2025/1/21 20:10:57

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第14章 反射
        • 14.4 反射三定律
          • 14.4.1 接口到反射类型的转换
          • 14.4.2 反射到接口类型的转换
          • 14.4.3 修改反射类型对象

第14章 反射

14.4 反射三定律

在使用反射时,牢记这三条定律会让你对反射有更加清晰的认识。

14.4.1 接口到反射类型的转换

这里的反射类型指reflect.Type和reflect.Value。

反射的第一定律为:反射可以将接口类型变量转换为反射类型变量。我们来看reflect.TypeOf的定义,通过该函数,将传入的interface{}类型的变量进行解析后返回reflect.Type类型:

func TypeOf(i interface{}) Type

reflect.ValueOf则是将传入的interface{}类型的变量进行解析后返回reflect.Value类型:

func ValueOf(i interface{}) Value

[ 动手写 14.4.1]

package main

import (
   "fmt"
   "reflect"
)

func main() {

   var a int = 5

   fmt.Printf("type: %T \n", reflect.TypeOf(a))
   fmt.Printf("value: %T \n", reflect.ValueOf(a))

}

动手写14.4.1打印输出了reflect.TypeOf(a)和reflect.ValueOf(a)的类型,其中“%T”表示输出变量的类型,运行结果如下:

在这里插入图片描述

14.4.2 反射到接口类型的转换

反射的第二定律为:反射可以将反射类型变量转换为接口类型

这主要使用了reflect.Value对象的Interface()方法,可以将一个反射类型变量转换为接口变量。

举个例子:

[ 动手写 14.4.2 ]

package main

import (
   "fmt"
   "reflect"
)

func main() {

   var a int = 5
   valueOfA := reflect.ValueOf(a)

   fmt.Println(valueOfA.Interface())
}

运行结果:

在这里插入图片描述

14.4.3 修改反射类型对象

反射的第三定律为:想要使用反射来修改变量的值,其值必须是可写的(CanSet)

这个值必须满足两个条件:一是变量可以被寻址(CanAddr),二是变量是可导出的(结构体字段名首字母需大写)。

对于可以被寻址,需要使用reflect.ValueOf()方法对反射对象的地址获取其reflect.Value对象,再使用Elem()获取实例地址的元素,通过此方式获取的reflect.Value是可以被寻址的,例如:

valueOfPerson := reflect.ValueOf(&person)

对于结构体而言,结构体字段必须是可导出的,不能为匿名字段,且字段名的首字母必须要大写。

[ 动手写14.4.3 ]

package main

import (
   "fmt"
   "reflect"
)

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

func main() {

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

   for i := 0; i < valueOfPerson.Elem().NumField(); i++ {
      fieldValue := valueOfPerson.Elem().Field(i)
      fieldType := typeOfPerson.Elem().Field(i)

      fmt.Printf("类型名: %v 可以寻址: %v 可以设置: %v \n", fieldType.Name, fieldValue.CanAddr(), fieldValue.CanSet())
   }

   fmt.Println("修改前: ", person)

   // 必须满足可寻址 和可导出两个条件才能修改变量值
   valueOfPerson.Elem().Field(0).SetString("xiao zhang")

   fmt.Println("修改后: ", person)
}

动手写14.4.3中的结构体person中只有Name字段的值可以修改,age字段和匿名字段由于不可导出的原因导致其值不能修改,运行结果如下:

在这里插入图片描述

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

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

相关文章

网络攻防中如何在海量虚假IP中找到目标服务或者设备的真实IP地址

网络攻防中如何在海量虚假IP中找到目标服务或者设备的真实IP地址。 Fav-up是一款功能强大的IP查询工具,该工具可以通过Shodan和Favicon(网站图标)来帮助研究人员查询目标服务或设备的真实IP地址。 工具安装 首先,该工具需要本地设备安装并部署好Python 3环境。然后广大研究…

5 | 如何更换证书

目录1 操作场景2 操作类型2.1 更换自有证书2.2 腾讯云托管证书2.3 一键替换证书3 结果校验1 操作场景 如果证书已过期&#xff0c;用户在浏览网站的时候会显示证书不可信&#xff1b; 2 操作类型 2.1 更换自有证书 登录 Web 应用防火墙控制台&#xff0c;在左侧导航中&…

load_ext是干什么的(autotime,autoreload)

文章目录load_extautotimeautoreload声明&#xff1a;本文都是自己的理解。 load_ext load_ext是jupyter notebook中的一个命令&#xff0c;而jupyter notebook和Ipython几乎可以等同。那load_ext作用是什么呢&#xff1f;我感觉作用就是类似于import。 load_extload extenst…

单片机AT89C51六位数码管秒表

详细代码讨论加我QQ&#xff1a;1271370903 1.1设计目的 本设计的数字电子秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理&#xff0c;结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来&#xff0c;使得系统能够实…

【Unity大气渲染】关于单次大气散射的理论知识

参考 最近在实现程序化天空盒&#xff0c;到了实现大气散射这一步&#xff0c;索性查漏补缺&#xff0c;把大气散射这块儿的理论知识补充明白了。跟着【实战】从零实现一套完整单次大气散射_一的推荐&#xff0c;学习这块我直接从Volumetric Atmospheric Scattering啃起。 补…

平安夜,愿大家平安健康!

12月24日平安夜(Christmas Eve)&#xff0c;是圣诞节前夕的晚上&#xff0c;寓意着耶稣诞生的夜晚会给世人带来平安幸福。 据《圣经》记载&#xff0c;耶稣诞生的那一晚&#xff0c;在旷野看守羊群的牧羊人&#xff0c;突然听见有声音自天上传来&#xff0c;向他们报耶稣降生的…

华为云桌面能为设计行业提供哪些“黑科技”?

华为云桌面能为设计行业提供哪些“黑科技”&#xff1f; 如今&#xff0c;传统设计模式中的软硬件更新迭代成本高、团队协作低效、资产利用率低和上下游进步不同步等缺陷日益显露&#xff0c;已经不能适应市场需求。华为云桌面携手赞奇科技打造出一个全方位的一站式云上内容制作…

[内网渗透]—GPO批量控制域内主机

GPO GPO(组策略管理),用来存储Active Directory中的策略。 自Windows Server2008开始,GPO开始支持计划任务,便于管理域中的计算机和用户,默认情况下,域用户的组策略每90分钟更新一次,但会随机偏移0-30分钟,域控制器的组策略每5分钟刷新一次 应用场景 在拿到域控后,…

数字硬件建模SystemVerilog-组合逻辑建模(3)使用函数表示组合逻辑

数字门级电路可分为两大类&#xff1a;组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点&#xff0c;在后面会作为单独的主题处理。组合逻辑描述了门级电路&#xff0c;其中逻辑块的输出直接反映到该块的输入值的组合&#xff0c;例如&#xff0c;双输入AND门的输出…

艾美捷Annexin V-FITC凋亡检测试剂盒:简单、快速

艾美捷Annexin V-FITC凋亡检测试剂盒&#xff1a;简单、快速的检测&#xff0c;区分凋亡细胞和坏死细胞。 艾美捷Annexin V-FITC凋亡检测试剂盒基本参数&#xff1a; 中文名称&#xff1a;Annexin V-FITC apoptosis detection kit 英文名字&#xff1a;Annexin V-FITC apopto…

Redis6入门到实战------ 四、Redis配置文件介绍

1.1 单位 配置大小单位,开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit 大小写不敏感 1.2 INCLUDES包含 类似jsp中的include&#xff0c;多实例的情况可以把公用的配置文件提取出来 1.3 网络相关配置 1.3.1 bind 默认情况bind127.0.0.1只能接…

linux基础学习-vim使用方法

直接输入vim&#xff0c;进入的是空白vim基本使用 命令模式&#xff1a;按键代表命令 i/a&#xff0c;切换为编辑模式:,切换到末行模式dd&#xff0c;删掉一行&#xff08;前面可以加数字&#xff09;yy&#xff0c;复制光标所在行&#xff08;前面可以加数字&#xff09;p&…

一建,PMP,软考,优先考哪个?

需要pmp资料可看封面或在文末获取。 这三者的共同点都是含有“项目管理”知识&#xff0c;可以用于项目管理岗位。 根据容易程度和知识点的基础程度来分&#xff0c;最好按照&#xff1a;PMP&#xff0c;软考&#xff0c;一建的顺序来考。 分别介绍一下三者&#xff1a; 【…

Robust Pose Estimation in Crowded Scenes with Direct Pose-Level Inference 阅读笔记

基于直接姿态级推理的拥挤场景鲁棒姿态估计 NeurIPS 2021 论文链接 代码链接 摘要&#xff1a;拥挤场景下的多人姿态估计具有挑战性&#xff0c;因为重叠和遮挡使得难以检测人体边界框并从单个关键点推断姿态线索&#xff08;关键点位置&#xff09;。为解决该问题&#xff0…

[MySQL]-死锁案例-唯一索引上的并发插入

[MySQL]-死锁案例-唯一索引上的并发插入 森格 | 2022年12月 本文是对实际work中遇到的死锁问题的复现&#xff0c;其目的是学会去分析死锁日志、还原日志上下文、理解死锁产生原因、MySQL处理机制&#xff08;回滚事务的选择&#xff09;&#xff0c;最后到死锁的解决方案的提…

7张图,剖析Redis缓存,文末附Redis工具类源码,建议收藏

一、缓存是什么&#xff1f; 缓存就是数据交换的缓存区&#xff0c;是存储数据的地方&#xff0c;一般读写性能较高。 二、缓存的作用和成本 1、缓存的作用 降低后端负载 提高读写效率&#xff0c;降低响应时间 2、缓存的成本 数据一致性成本 代码维护成本 运维成本 三、…

IDEA中新建找不到Vue Component | IDEA右键Create New Servlet找不到Setvlet

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 解决&#xff1a;IDEA中新建找不到Vue Component 打开IDEA&#xff0c;依次打开 &#xff08;文件——设置——编辑器——文件或代码模板&#xff09; 找到右侧&#…

Spring—Spring AOP1

文章目录AOP概念的引入AOP相关的概念1.AOP的概述2. AOP的优势3. AOP的底层原理如何利用AOP对原有业务进行增强利用注解方式切入点表达式AOP相关的术语————————————————————————————————AOP概念的引入 首先我们来看一下登录的原理 如上图所示这…

【云原生 | Kubernetes 实战】16、K8s 配置管理中心 ConfigMap 实现微服务配置管理

目录 一、ConfigMap 概述 1.1 什么是 ConfigMap&#xff1f; 1.2 ConfigMap 能解决哪些问题&#xff1f; 1.3 ConfigMap 应用场景 1.4 局限性 二、ConfigMap 创建方法 2.1 根据字面值创建 ConfigMap 2.2 基于文件创建 ConfigMap 2.3 基于目录创建 ConfigMap 2.4 编…

【大数据系列之MySQL】(二十二):MySQL中的分组查询group by

对于常见的函数都是单行函数&#xff0c;说白了就是一一映射&#xff0c;输入一个值则输出对应的值&#xff0c;但是MySQL中还存在聚合函数就是输入一组值则返回一个值&#xff0c;常见的例如&#xff1a;sum、max等 很多时候需要对数据中的某些字段进行分组&#xff0c;探究每…