上课无聊之Go泛型

本文探讨了Go语言中泛型的实现方式,包括使用反射、断言以及直接使用Go1.18引入的内置泛型。通过示例代码展示了如何遍历不同类型的切片,并对比了各种方法的优缺点。同时,介绍了自定义泛型类型和函数的应用,以及泛型在类型约束中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天的课有点无聊,还是一天满课,然后就看了一点点泛型做个笔记
大家随意看看

package main

import (
	"fmt"
	"reflect"
)

//今天上课的时候摸鱼看了一下Go的泛型,简要写几个例子吧,大概记录一下实现的过程
//写的很垃,大家不要介意就是我的个人笔记罢了

//用反射+接口来判断类型,个人觉得性能上可能有较大的差距,个人还是不建议这样用的

func Range3(arr interface{}) {
	//reflect.TypeOf()获得任意值的对象
	typeOfA := reflect.TypeOf(arr)
	fmt.Println(typeOfA, typeOfA.Kind())
	//然后对不不同的值遍历又要判断
	if typeOfA.String() == "[]int" {
		//感觉还是逃不过断言
		for _, v := range arr.([]int) {
			fmt.Println(v)
		}
	}
	if typeOfA.String() == "[]string" {
		for _, v := range arr.([]string) {
			fmt.Println(v)
		}
	}
}

//断言的方式完成泛型

func Range2(arr interface{}) {
	if _, ok := arr.([]string); ok {
		for _, v := range arr.([]string) {
			fmt.Println(v)
		}
	}
	if _, ok := arr.([]int); ok {
		for _, v := range arr.([]int) {
			fmt.Println(v)
		}
	}

}

//直接使用泛型,好处就是会自动匹配类型
//any可以点进去看一下其实本质就是interface{},可以接收任何类型的数据
//里面放comparable,表示的是Go里面所有内置的可比较类型:`int、uint、float、bool、struct和指针等等

func Range[T any](arr []T) {
	for _, v := range arr {
		fmt.Println(v)
	}
}

type MySlice[T int | string] []T

func (S MySlice[T]) Sum() T {
	var sum T
	for _, v := range S {
		sum += v
	}
	return sum
}

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

func main() {
	INT := []int{1, 2}
	STRING := []string{"xiaoyingtongxue", "xiaolintongxue"}
	//参数传进去之后会自动确认类型
	Range(INT)
	Range(STRING)
	Range2(INT)
	Range2(STRING)
	Range3(INT)
	Range3(STRING)

	//自定义泛型类型,[T ]里面的是类型约束
	//type MySlice[T int | string] []T
	泛型类型必须实例化为具体类型
	//var a MySlice[int] = []int{1, 2, 3}
	//var b MySlice[string] = []string{"xiaoyingtongxue", "xiaolint"}
	//fmt.Println(a, b)

	type MyMap[KEY int | string, VALUE int | string] map[KEY]VALUE
	var V1 MyMap[int, string] = map[int]string{
		1: "xiaoyingtongxue",
		2: "xiaolintongxue",
	}
	var V2 MyMap[string, string] = map[string]string{
		"1": "xiaoyingtongxue",
		"2": "xiaolintongxue",
	}
	fmt.Println(V1, V2)

	var myslice MySlice[int] = []int{1, 2, 3, 4, 5}
	fmt.Println(myslice.Sum())
	//可以不加泛型约束,会自动转成下面这种,就是一种语法糖
	fmt.Println(Add(1, 2))
	fmt.Println(Add[int](1, 2))
	fmt.Println(Add[string]("1", "2"))
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newbie_______

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值