go语言的反射和泛型

这篇具有很好参考价值的文章主要介绍了go语言的反射和泛型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

反射

反射可以在程序的运行时获取变量的各种信息。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语言的反射和泛型

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

声明式的返回值类型还是any接口,但是在运行后就变成了string,这就是泛型自动转换了。
go语言的反射和泛型

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

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
}

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

go语言的反射和泛型

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

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

go语言的反射和泛型文章来源地址https://www.toymoban.com/news/detail-496304.html

到了这里,关于go语言的反射和泛型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Rust】——提取函数消除重复代码和泛型

    🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL:数据结构_IT闫的博客-CSDN博客 🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客 💎C++:C++_IT闫的博客-CSDN博

    2024年03月26日
    浏览(55)
  • Java重修第八天—枚举和泛型

    通过学习本篇文章可以掌握如下知识 1、枚举 2、泛型 枚举是一种 特殊类 枚举类的格式: 为什么说枚举是一个特殊类,定义一个简单的枚举如下: 将其编译成class文件后,使用IDEA打开, 结果如下 :可以看出枚举类A有私有构造器。 枚举类的第一行只能罗列一些名称, 这些

    2024年01月17日
    浏览(38)
  • 数据结构(Java实现)-包装类和泛型

    包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型。 基本数据类型和对应的包装类 装箱和拆箱 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中 拆箱操作,将 Integer 对象中

    2024年02月11日
    浏览(38)
  • Armadillo:矩阵类、向量类、Cube类和泛型类

    密集矩阵的类,其元素按列优先顺序存储(即逐列) 根矩阵类是 Mattype ,其中 type 是以下项之一: float 、 double 、 std::complexfloat 、 std::complexdoubleshort 、 int 、 long 和无符号的 short 、 int 、 long 为方便起见,定义了以下 typedef: 在本文档中,为了方便起见,使用了垫子类型;

    2024年04月15日
    浏览(40)
  • C++、STL标准模板库和泛型编程 ——适配器、补充(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月27日
    浏览(70)
  • C++、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月25日
    浏览(51)
  • Go语言入门11(泛型)

    一个计算sum的函数 ​如果需要提供对int,float64,string三种数据类型的求sum函数,那么不使用泛型的情况下就需要单独写三个函数,此时就需要使用泛型这种概念,来避免重复代码出现 在函数传参中使用泛型 ​同上一个例子相同,在函数声明中定义泛型,然后将他利用于入参

    2023年04月24日
    浏览(36)
  • Go语言之反射(反射的简单使用,原理)

    1.什么是反射 Go语言中,反射的机制就是在运行的时候,可以获取到其变量的类型和值,且可以对其类型和值进行检查,对其值进行修改。 即在不知道具体的类型的情况下,可以用反射机制来查看变量类型、更新变量的值。 Go中反射主要涉及到两个概念:Type和Value。对所有的

    2023年04月25日
    浏览(35)
  • 【注解和反射】获取类运行时结构

    继上一篇博客【注解和反射】类加载器-CSDN博客 目录 七、获取类运行时结构 测试 getFields()和getDeclaredFields() getMethods()和getDeclaredMethods() 获取类运行时结构通常指的是在Java等面向对象编程语言中,使用反射(Reflection)机制来检查类、接口、字段(Field)和方法(Method)等程序

    2024年04月28日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包