go语言的反射和泛型

news2024/9/29 17:24:11

反射

反射可以在程序的运行时获取变量的各种信息。Go语言中光反射在reflect包下。

http://c.biancheng.net/view/4407.html

泛型

Go语言中通过断言转化为指定类型。

func main() {
	arr := []string{"int", "dghjs", "hdk"}
	printArr(arr)
	arr1 := []int{1, 2, 3}
	printArr(arr1)
}

// 多类型判断
// 保证参数的多样性
// 保证处理值的多样性
func printArr(arr interface{}) {
	//string
	if v, ok := arr.([]string); ok {
		for _, v := range v {
			fmt.Println(v)
		}
	}
	//int
	if v, ok := arr.([]int); ok {
		for _, v := range v {
			fmt.Println(v)
		}
	}
	//...
}

但是这并不具有通用性,通过断言的判断必须是已有定义的类型,未定义的就不可用,因此没有通用性。泛型就是来解决这一问题的方案,使类型判断具有通用性。

Go泛型学习之路

在如下的add函数中更需要将两个数相加,可以写成如下函数

func add(x int, y int) int {
	return x + y
}

在实际上需要传入的类型可能更多,如浮点型,字符串,那么就需要编写如下函数:

func addF(x float32, y float32) float32 {
	return x + y
}

//
func addS(x string, y string) string {
	return x + y
}

这样实现同一功能就需要编写若干同样的方法,在一个函数中变化的量在参数和返回值中,而这三个量在定义时是不分配内存的即在传入实参时类型是未知的。

那么将参数和返回值定义可以直接指向任意类型的变量即可。泛型就是来实现统筹的类型及相关解决方案的。

在go语言中interface{}可以指代任何类型,那么就可以使用接口作为参数课返回值。如下:

package main

import "fmt"

func main() {
	println("hello")
	//a1 := add(10, 100)
	s1 := add("hello", "world")
	fmt.Printf("value=%v,type=%T", s1, s1)
}

//泛型优势
/*
1. 函数参数和返回值的人类型
2. 集合元素类型的显式声明
*/

// func add(x int, y int) int {
// 	return x + y
// }

func add(x any, y any) any {
	var resultINT int
	var resultFLOAT float32
	var resultSTRING string
	n, ok := x.(int)
	if ok {
		resultINT = n + y.(int)
	}
	m, ok := x.(float32)
	if ok {
		resultFLOAT = m + y.(float32)
	}
	z, ok := x.(string)
	if ok {
		resultSTRING = fmt.Sprint(z, y.(string))
	}
	if n != 0 {
		return resultINT
	}
	if z != "" {
		return resultSTRING
	}
	return resultFLOAT
}

在这里插入图片描述

小编使用的go版本是1.19已经支持泛型了,而且返回值为接口时已经会自动转化成返回的实际类型了。
不想Java若用Object作为参数还需要强转。

声明式的返回值类型还是any接口,但是在运行后就变成了string,这就是泛型自动转换了。
在这里插入图片描述

如果没有泛型就需要手动转换,如下:

a2 := add(10, 15).(int)
s2 := add("你好", "泛型").(string)

在Java中类是一等公民,所以泛型围绕着类展开,如ArrayList<String>,而在go中函数是一等公民泛型围绕函数展开。

在go中方法通过泛型通过[泛型 类型]声明,并紧跟方法之后,支持|逻辑的多个类型声明。

[T int]
[T int | float32| float 64 | string]

注意只能是|不能是||,前者取一个后者取两个。

func add[T int | float32 | string](a, b T) T {
	return a + b
}

通过泛型声明编辑器可以自动转换和指明类型,如下:

在这里插入图片描述

//不指明类型
a3 := add(1, 8)
fmt.Println(a3)
s3 := add("hello", "world")
fmt.Println(s3)
//声明类型
a4 := add[int](19, 25)

s4 := add[string]("你好", "泛型")

在这里插入图片描述

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

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

相关文章

【JavaWeb】servlet实现excel表格数据批量导入到数据库

这是一个教大家使用excel表格&#xff0c;批量将数据导入到数据库的一个教程 通过Javaweb项目 的servlet技术实现&#xff0c;教程详细简单&#xff0c;跟着做就不会报错&#xff01; 1.下载依赖包&#xff1a; tomcat-jdbc的jar包下载&#xff1a;文件上传批量导入数据库依赖…

一篇打通,性能测试与性能测试瓶颈评估,测试之道...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是性能测试&a…

硬件系统工程师宝典(30)-----降压式Buck电路分析

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到DC/DC变换中的开关调节模式有功耗小、效率高并且稳压范围宽的特点以及DC/DC的指标参数和设计要求。今天我们来分析一下DC/DC中的一个典型…

嬴图 | 围绕中心性算法在寄生虫网络的研究

算法在实践中的应用有哪些&#xff1f;中心性算法的特点和应用一文了解。 前言 寄生&#xff08;Parasitism&#xff09;是两种生物之间的一种“消费者—资源”的关系&#xff0c;即寄生虫&#xff08;Parasite&#xff09;和它的宿主&#xff08;Host&#xff09;。 寄生虫…

智芯MCU软件开发环境搭建

智芯MCU软件开发环境搭建 目录 智芯MCU软件开发环境搭建前言1 软件安装2 编译环境3 烧录环境4 新建工程结束语 前言 智芯科技的MCU主要应用于汽车行业&#xff0c;属于车规级的MCU&#xff0c;目前上市的MCU型号较少&#xff0c;相关资料也不多&#xff0c;所以这里出一期开发…

医学影像信息系统(PACS源码)基本概况和工作原理

一、医学影像信息系统&#xff08;PACS&#xff09;基本概况 医学影像信息系统&#xff08;PACS&#xff09;是一种集影像采集、传输、存储、管理、查询、诊断、报告、归档和科研于一体的综合性应用系统。它基于医学影像存储与通信系统&#xff08;Picture Archiving and Comm…

Seata Saga 模式理论学习、生产级使用示例搭建及注意事项(一) | Spring Cloud57

一、前言 通过以下系列章节&#xff1a; docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

当我用AI为开发AntV图表插上想象的翅膀后

前言 做前端图表时&#xff0c;最耗时的就是找配置参数&#xff0c;比如你在使用AntV G2时&#xff0c;为了更加美观&#xff0c;拉大数据之间的差距&#xff0c;需要将y轴设置一个最小值&#xff0c;由于每个图表的参数少说十几个&#xff0c;多达二十多个&#xff0c;一个一…

C# 反射 (Reflection) 的常用功能

目录 一、概述 二、实例化类 三、反射赋值 四、获取字段值 五、获取字段名 六、获取字段类型 七、调用方法 结束 一、概述 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块&#xff0c;而模块包含类型&#xff0c;类型又包含成员。反射则…

华为认证 | HCIE-Datacom 考试大纲

01 HCIE-Datacom考试概述 02 HCIE-Datacom考试内容 HCIE-Datacom V1.0 考试覆盖数据通信领域&#xff1a;路由交换高阶技术、企业网络架构全景、园区网络典型架构与技术、华为CloudCampus解决方案设计与部署、广域互联网络典型架构与技术、华为SD-WAN解决方案设计与部署、广域…

人机接口回路原理(四)

五、硬件时钟电路 接口插件设置了一个硬件时钟电路&#xff0c;由一片MC146818时钟芯片及辅助元器件组成&#xff0c;如图1&#xff0d;35所示。 MC146818芯片是智能式硬件时钟&#xff0c;其内部由电子时钟和存储器两部分组成。可计年、月、日、时、分、秒、星期&#xff1b;能…

时间序列中的无监督表示学习

自监督学习中&#xff0c;有一个常用的方法是对比学习&#xff1b; 2.  时间序列的表示学习 1.1 采用对比学习的方式 Time-series representation learning via temporal and contextual contrasting(IJCAI’21) 本文采用对比学习的方式进行时间序列表示学习。首先对于同一…

告别原始 UI 样式,拥抱 Fluent Design 风格 PyQt/PySide 组件库

简介 这是一个使用 PyQt/PySide 编写的 Fluent Design 风格的组件库&#xff0c;支持亮暗主题无缝切换和自定义主题色&#xff0c;搭配 QtDesigner 可以快速开发美观的界面。github 仓库地址为 https://github.com/zhiyiYo/PyQt-Fluent-Widgets &#xff0c;演示视频可以在哔哩…

夏至后,这些农事活动要注意管理

夏至过后&#xff0c;温度会进一步攀登&#xff0c;较高的气温和光照会让夏作物生长更加旺盛。接下来就让我们看看在这些夏作物在种植时都需要注意哪些方面吧&#xff01; 一、蔬菜管理 夏白菜、夏甘蓝、夏菜花都是在6月下旬开始育早熟的菜花苗&#xff0c;秋大棚中的芹菜也是…

超强总结,性能测试实战(购物业务板块)真实压测场景...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 购物网站购物流程…

人工智能(pytorch)搭建模型13-pytorch搭建RBM(受限玻尔兹曼机)模型,调通模型的训练与测试

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型13-pytorch搭建RBM(受限玻尔兹曼机)模型&#xff0c;调通模型的训练与测试。RBM(受限玻尔兹曼机)可以在没有人工标注的情况下对数据进行学习。其原理类似于我们人类学习的过程&#xff0c…

Redis简单动态字符串SDS

目录 前言 一.SDS定义 二.SDS与C字符串的区别 2.1 常数复杂度获取字符串的长度 2.2 杜绝缓冲区溢出 2.3 减少修改字符串时带来的内存重分配次数 2.3.1 空间预分配 2.3.2 惰性空间释放 2.4 二进制安全 2.5 兼容部分C字符串函数 2.6 总结 三.SDS缺点 前言 Redis没有直接使用C语…

gRPC教程与应用

gRPC是是谷歌一个开源的跨语言的RPC框架&#xff0c;面向移动和 HTTP/2 设计。 grpc中文网 在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法&#xff0c;使得您能够更容易地创建分布式应用和服务。 gRPC 也是基于以下理念&#xff1…

python3+requests+unittest接口自动化测试

1.环境准备 python3 pycharm编辑器 2.框架目录展示 &#xff08;该套代码只是简单入门&#xff0c;有兴趣的可以不断后期完善&#xff09; &#xff08;1&#xff09;run.py主运行文件&#xff0c;运行之后可以生成相应的测试报告&#xff0c;并以邮件形式发送&#xff1b;…

【C++进阶】红黑树实现

文章目录 红黑树的概念红黑树的性质红黑树节点的定义红黑树结构红黑树的插入1.按照二叉搜索的树规则插入新节点2.进行旋转和变色源码 红黑树的验证中序遍历判断是否满足二叉搜索树判断是否满足红黑树 完整源码 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但…