小工具      在线工具  汉语词典  css  js  c++  java

go语言的反射和泛型

Go,golang,算法 额外说明

收录于:152天前

反射

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

http://c.bian Cheng.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]("你好", "泛型")

在这里插入图片描述

. . .

相关推荐

额外说明

当你的软件测试遇到加密接口时,是不是就无法测试了?

相信大家在工作中做接口测试的时候,肯定会遇到一个场景,那就是你们的软件,密码是加密存储的。 那么这样的话,我们在执行接口的时候,对于密码的处理就开始头疼了。 所以,本文将使用jmeter这款java开源的接口测试工具,给大家来讲解jmeter完成加密的接

额外说明

一个可以入简历的软件测试电商项目(超详细版),还不进来拿一下吗?

前言 说实话,在找项目的过程中,我下载过(甚至付费下载过)N多个项目、联系过很多项目的作者,但是绝大部分项目,在我看来,并不适合你拿来练习,它们或多或少都存在着“问题”,比如: 1.大部分项目是web项目,很难找到app项目,特别是有app安装包的项目大

额外说明

你凭什么能过上你想要的生活?(思考篇)

鱼C工作室 2013-09-26 前几天看到一句话“你大学里的志愿是你父母选的,你大学里的课程是你挑好过的选的,那你凭什么要过上你想要的生活?”这句说给每个年轻人的话,瞬间点燃了我。 假期闲来无事,收到公司的通知邮件,公司的网络课程第二轮课程开始,请在X

额外说明

Enum枚举类高级玩法

  日常有限的常量集合属性,我们使用的都是Enum或者枚举类,本篇文章我们说的是枚举的一些高级用法,   每一个enum枚举值还可以拥有各自的内部方法,这样我们在日常写业务代码时,可以利用枚举这种方式简化代码. 代码如下: 1.枚举类定义 public

额外说明

Direct3D 12——计算着色器——纹理输出与无序访问视图

能与计算着色器绑定的资源类型有缓冲区与纹理两种。 纹理输出与无序访问视图 在计算着色器代码中,我们定义了一个输出资源: RWTexture2D<float4> gOutput; 计算着色器处理输出资源的方式比较特殊,它们的类型还有一个特别的前缀“RW”

额外说明

PASCAL、_stdcall、_cdecl等调用方式说明

调用一个函数时,参数的传递是由堆栈来完成的,PASCAL的惯例是参数从左向右压入堆栈,堆占的指针的还原可由被掉用的程序本身来负责,这样还原堆栈指针的代码在被调用的函数中,此代码(还原指针)只有一份。而C的惯例是参数入栈是从右向左,堆占的指针的还原可由调用

额外说明

C语言刷题随记 —— 自由落体的球

文章目录 题目 思路 题解 样例输出 题目 一球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10 次落地时,共经过多少米?第 10 次反弹多高? 思路 利用循环不断求高度的一半并相加即可。 题解 #include <stdi

额外说明

3.登录用户功能列表

概述 使用 ElementUI dropdown 制作登录后菜单效果 界面 <template> <div class="user-main"> <el-dropdown class="login-user" trigger="h

额外说明

新年快到了,让我们一起用Python编织中国结吧

- 作者:FrigidWinter - 简介:主攻机器人与人工智能领域的理论研究和工程应用,业余丰富各种技术栈。主要涉足:【机器人(ROS)】【机器学习】【深度学习】【计算机视觉】 - 专栏: 《机器人原理与技术》 《计算机视觉教程》 《机器学习》 《嵌

额外说明

.NET开发人员十大必备下载工具

.NET开发人员十大必备下载工具 出处: .NET Tools:Ten Must-Have Tools Every Developer Should Download Now 本文讨论的工具如下:   NUnit:编写单元测试的工具   NDoc:创建代

ads via 小工具