非零基础自学Golang 第14章 反射 14.2 基本用法 14.2.2 获取类型的值 14.2.3 使用反射调用函数

news2025/1/23 21:11:01

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第14章 反射
        • 14.2 基本用法
          • 14.2.2 获取类型的值
          • 14.2.3 使用反射调用函数

第14章 反射

14.2 基本用法

14.2.2 获取类型的值

Go语言使用reflect.TypeOf来获取类型信息,使用reflect.ValueOf来获取变量值的信息。

reflect.ValueOf()函数可以获取值的反射值对象(reflect.Value),使用方法如下:

var valueOfNum reflect.Value = reflect.ValueOf(num)

reflect.Value是反射中非常重要的类型,获取变量的值和反射调用函数都需要使用该类型。

reflect.Value有一系列的获取变量值的方法,例如Int()方法用来获取int类型变量的值,如果用此函数获取其他Kind(非Int、Int8、Int16、Int32、Int64类型变量)的值将会引发panic。

[ 动手写 14.2.3 ]

package main

import (
   "fmt"
   "reflect"
)

func checkValue(v reflect.Value) {

   if v.Kind() == reflect.Ptr {

      v = v.Elem()
   }
   if v.Kind() == reflect.Int {

      // 方法一
      var v1 int = int(v.Int())
      // 方法二
      var v2 int = v.Interface().(int)

      fmt.Println(v1, v2)
   }
}

func main() {

   var num int = 10
   valueOfNum := reflect.ValueOf(num)
   fmt.Println("valueOfNum")
   checkValue(valueOfNum)

   valueOfNumPtr := reflect.ValueOf(&num)
   fmt.Println("valueOfNumPtr")
   checkValue(valueOfNumPtr)
}

动手写14.2.3使用int类型变量为例子,函数checkValue()依旧会对指针类型变量做特殊处理,使用两个方法获取变量num的值,一个是使用上面介绍的Int()函数获取,再从reflect.Value类型强制转换成int类型数据,另一个是使用Interface()方法转换成Interface{}类型,再从Interface{}类型转换成int类型数据。

运行结果如下:

在这里插入图片描述

14.2.3 使用反射调用函数

使用反射调用函数需要用到reflect.ValueOf()方法传入想要反射的函数名,获取到reflect.Value对象,再通过reflect.Value对象的Call方法调用该函数,Call方法的声明如下:

func (v Value) Call(in []Value) []Value

Call方法使用输入的参数in调用v持有的函数。例如,如果len(in) == 3,v.Call(in)代表调用v(in[0], in[1], in[2])(其中Value值表示其持有值)。

如果v的Kind不是Func会引发panic。它返回函数所有输出结果的Value封装的切片。和Go代码一样,每一个输入实参的持有值都必须可以直接赋值给函数对应输入参数的类型。

如果v持有值是可变参数函数,Call方法会自行创建一个代表可变参数的切片,将对应可变参数的值都拷贝到里面。

[ 动手写 14.2.4]

package main

import (
   "fmt"
   "reflect"
)

func Equal(a, b int) bool {

   if a == b {
      return true
   }

   return false
}

func main() {

   // 反射调用函数需使用 ValueOf
   valueOfFunc := reflect.ValueOf(Equal)

   // 构造函数参数
   args := []reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2)}

   // 通过反射调用函数计算
   result := valueOfFunc.Call(args)

   fmt.Println("函数运行结果: ", result[0].Bool())
}

动手写14.2.4定义了一个Equal函数,Equal函数传入参数a、b判断两个值是否相等,返回对应结果。

主函数使用reflect.ValueOf获取reflect.Value对象,并构造了参数args传入Call函数中,运行结果如下:

在这里插入图片描述

【懂了!!】

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

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

相关文章

云原生|kubernetes|CKA真题解析-------(6-10题)

第六题: service配置 解析: 考察两个知识点: deployment控制器内的port命名 暴露一个pod内的端口到新建的服务内的 这里有一个需要注意的地方,没有告诉你deployment控制器在哪个namespace。假设这个front-end这个pod是在A这个…

前端CSS Flex布局8大重难点知识,收藏起来吧

2009年,W3C提出了一种新的方案—-Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 Flex布局将成为未来布局的首选方案。这也是学习前…

Spring之底层架构核心概念-BeanDefinition

目录1.什么是BeanDefinition?2.如何生成BeanDefinition?2.1. Component2.1. bean标签2.3. Bean注解2.4. AbstractBeanDefinition2.5. 利用BeanDefinition 读取器-解析类2.6. XmlBeanDefinitionReader - 解析 xml文件2.7. ClassPathBeanDefinitionScanner 扫描生成 …

2022年度回顾 | 技术篇:突破公链不可能三角的努力

2022年接近尾声,驻足回看行业这一年的跌宕起伏,无论是技术的突破,应用的创新,还是生态的兴衰,皆成为了行业发展的历史注脚。如往年一样,万向区块链于年末推出重磅年度回顾系列文章:《公链技术篇…

一款免费的开源的 Switch 模拟器,支持超过3200款游戏

一款免费的开源的 Switch 模拟器,支持超过3200款游戏。 Ryujinx是一个开源的任天堂Switch模拟器,由gdkchan创建,用C#编写。该模拟器旨在提供卓越的准确性和性能、用户友好的界面和一致的构建。它是从头开始编写的,于2017年9月开始…

深度学习——锚框(笔记)

1.锚框的解释 目标检测算法中,通常会在输入图像中采样大量区域,然后判断这些区域是否包含所感兴趣的目标,并调整区域边界从而更加准确的预测目标真实的边缘框。 ①一类目标检测算法是基于锚框的 ②提出多个框被称为锚框的区域(…

GIS开发入坑(三)--QGIS制作行政区划及背景图层

QGIS,功能强大的GIS工具,地理信息开发中的必备神器,今天以南京市为例制作行政区划并使用电子地图为数字底图进行呈现。 1.获取行政区划数据 阿里云的可视化平台提供了便捷的中国行政区划数据获取方式,数据层级最小到区县级。 htt…

游戏视频录制用什么软件?这2款软件,用过都说好

小编相信很多朋友在游戏中都有精彩的操作。有些朋友想和朋友分享他们在游戏中的精彩操作,但他们不知道有什么容易使用的免费游戏视频录制软件,可以记录他们在游戏中的亮眼表现。那么,哪个电脑游戏视频录制软件容易使用和免费呢?接…

【树莓派不吃灰】兄弟连篇⑤ 服务管理

目录1、服务分类2、rpm安装服务(旧版本系统)3、源码包安装(旧版本系统)❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-12-20 ❤️❤️ 本篇更新记录 2022-12-20 ❤️&#x1f3…

环境多介质逸度模型实践技术与典型案例【代码】应用

随着污染物在各种环境中的迁移和转化,多介质污染物模型日益受到关注。在各类多介质模型中,基于逸度概念的逸度模型由于运用范围广,建模数据要求较低而广受欢迎。 【原文链接】: 环境多介质逸度模型实践技术与典型案例【代码】应用…

《集体智慧编程》笔记(4 / 12):搜索与排名

由于书本未提供数据文件且提供的链接无法被链接且pysqlite安装失败,所以本章只是阅读学习。 文章目录搜索引擎的组成一个简单的爬虫程序使用urllib2爬虫程序的代码建立索引建立数据库Schema在网页中查找单词加入索引查询基于内容的排名归一化函数单词频度文档位置单…

JAVA面试(关于技术深耕方向和职业规划)

人的精力有限,制定清晰明确的技术发展方向,会使自己少走很多弯路。经过快10年的工作,我现在主要给自己在技术上定了这几个方向。 1、专注JAVA开发。 2、专注JAVA架构。 3、专注JAVA项目运维。 4、专注数字化业务项目。 5、专注JAVA项目的…

Springboot事件监听+@Async注解

文章目录一、不求甚解二、人云亦云三、刨根问底四、曲突徙薪一、不求甚解 在开发中经常可以利用Spring事件监听来实现观察者模式,进行一些非事务性的操作,如记录日志之类的。 Controller Controller中注入ApplicationEventPublisher,并利用…

内科大软件工程导论复习内容笔记

文章目录一、 概念(共60分,单选题、多选题)1. 软件是程序、数据、文档的集合。2. 软件的分类(按规模、性质分)3. 软件危机的表现、缓解软件危机的途径4. 软件工程方法学主要有两种:结构化的软件工程方法学_…

借助 Material Design,帮助您打造更好的无障碍应用 (上篇)

随着时代的发展,"无障碍体验" 对开发者的意义也愈发重大。我们准备了无障碍设计文章,帮助您为更多用户打造精彩应用。本文是第一篇内容,将为您介绍辅助技术,层次结构,颜色和对比度等内容。了解无障碍改进产品…

[前端攻坚]:Set的使用

总结一些日常需要用到的一些api,也是在一些面试中会经常出现的题目,今天分享的是Set的一些用法和个人的一些理解, 同时文章也被收录到我的《JS基础》专栏中,欢迎大家点击收藏加关注。 我们知道Set是一种叫做集合的数据结构&#x…

手把手教你成为荣耀开发者:如何获取平台帮助及最新通知?

荣耀开发者服务平台是荣耀面向开发者的统一生态入口,通过聚合周边内外部系统,分全球多站点部署,为全球开发者提供业务全生命周期的商业支撑服务,拥有应用分发、智慧服务、开放能力、HONOR Connect等众多业务等您来合作。 在与荣耀…

引擎入门 | Unity UI简介–第3部分(2)

本期我们继续为大家进行【Unity UI简介–第3部分】的后续教程 学习内容 4.添加遮挡面板 5.添加内容面板 6.添加按钮 文章末尾可免费获取教程源代码 本篇【Unity UI简介–第3部分】篇幅较长,分为八篇,本篇为第二篇,还未看过第一篇的请点…

Linux学习-89-JDK下载安装(rpm方式)

17.19 JDK下载安装(rpm方式) linux系统上jdk安装方式比较多,最简单的便是yum安装,可以使用以下步骤来安装: #首先先检查是否已经安装JDK [rootCncLucZK ~]# rpm -qa |grep java[rootCncLucZK ~]# rpm -qa |grep jdk …

Docker ( 三 ) 安装 MySQL

6.2.安装 MySQL 6.2.1.拉取镜像 6.2.1.1.搜索查看可用的mysql镜像 docker search mysql6.2.1.2.拉取最新版本的mysql镜像 docker pull mysql:latest6.2.1.3.查看镜像是否已经有mysql docker images|grep mysql6.2.2.启动容器 6.2.2.1.启动容器实例 启动同时设置名字以及r…