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

go语言的反射和泛型

Go,golang,算法 额外说明

收录于:15天前

反射

反射可以在程序的运行时获取变量的各种信息。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]("你好", "泛型")

在这里插入图片描述

. . .

相关推荐

额外说明

ANSYS软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 ANSYS是一款全球领先的工程仿真软件,广泛应用于机械、电气、流体、热力学等领域。它提供了强大的建模、网格划分、材料库、边界条件和载荷、求解器、结果后处理、批处理和脚本编程、多物理场仿真、协同设计和教育版等

额外说明

C++中的构造函数初始化列表

// .h #pragma once #include <iostream> using namespace std; class People { private: int age; string name; public: string

额外说明

kotlin 类和对象

import java.util.* // 类包含构造函数、初始化代码块、函数、属性、内部类、对象声明 // 非空属性必须在定义的时候初始化,kotlin提供了一种可以延迟初始化的方案,使用 lateinit 关键字描述属性 class People

额外说明

Spring第五阶段:bean对象的创建与配置使用

1、IOC之静态工厂方法创建Bean 配置通过静态工厂方法创建的bean 创建一个工厂类 public class PersonFactory { public static Person createPerson() { Person pe

额外说明

【Unity3D基础2-3】Unity3D开发环境搭建

一、引言 【Unity3D基础2-2】认识Unity3D引擎已更新完毕 这篇介绍Unity3D开发环境搭建 二、安装Unity3D版本中心《Unity Hub》 首先打开https://unity.cn/releases 点击Unity Hub(Win)

额外说明

关于如何操作Linux 防火墙

  防火墙(firewalld) 临时关闭防火墙 systemctl stop firewalld 永久防火墙开机自关闭 systemctl disable firewalld 临时打开防火墙 systemctl start firewalld 防火墙开

额外说明

Python面试准备:利用装饰器装饰函数,改为需要用户名和密码登入才能使用函数

# 装饰器 def new_func(func): def wrappedfunc(username, password): if username == "root" and password == "123":

额外说明

SpringCloud Alibaba集成Dubbo实现远程服务间调用

SpringCloud Alibaba集成Dubbo实现远程服务间调用 工程创建 一、创建springBoot分模块项目,父工程:springcloud-alibaba以及子模块product-dubbo-provider、order-dubbo-con

额外说明

Spark基础学习笔记10:Scala集成开发环境

文章目录 零、本讲学习目标 一、搭建Scala的Eclipse开发环境 (一)安装Scala插件 (二)创建Scala项目 二、搭建Scala的IntelliJ IDEA开发环境 (一)启动IDEA (二)安装Scala插件 (三)配置IDEA使用的默认

额外说明

将 List 转换为 String

将 List 转换为 String的几种方式 1、使用toString()方法将 List 转换为 String 2、使用Java 8 Streams Collectors api和String.join()方法将带有逗号分隔符或自定义分隔符的集合转换为

ads via 小工具