首页 > 其他分享 >GO语言泛型

GO语言泛型

时间:2022-12-29 19:58:21浏览次数:35  
标签:语言 float64 int fmt var 泛型 GO string

有一个遍历数组的方法,要求数组的类型既可以是int型也可以是float64型。以前面对不同数据类型但是逻辑相同的方法写起来会比较麻烦,有了泛型之后写起来就很容易了

// T就是泛型,Go语言中用[]来表示泛型
func PrintFunc[T int | string](arr []T) {
	for _, i := range arr {
		fmt.Println(i)
	}
}

Go语言泛型中还有两个内置类型

// any等价于interface{}, comparable 表示Go语言内置类型中所有可比较的类型
func PrintFunc[T any](arr []T) {
	for _, i := range arr {
		fmt.Println(i)
	}
}

泛型类型

func main() {
	// 泛型切片
	type MySlice[T int | float64 | float32] []T
	
	var s1 MySlice[int] = []int{1,2,3}
	fmt.Printf("%T\\n",s1) //main.Slice[int]
	var s2 MySlice[float64] = []float64{1,2,3}
	fmt.Printf("%T\\n",s2) // main.Slice[float64]
	var s3 MySlice[float32] = []float32{1,2,3}
	fmt.Printf("%T\\n",s3) // main.Slice[float32]
	
	// 泛系map
	type MyMap[Key int | string, Value int | string] map[Key]Value
	var m1 MyMap[string, int] = map[string]int {
		"sunday":0,
		"monday":1,
	}
	
	type MyInt[T int | string] int
	
	var a MyInt[int] = 1
	var b MyInt[string] = 1
	//var c MyInt[string] = "xx"  编译错误
	fmt.Printf("%T, %T\\n",a, b) // main.MyInt[int], main.MyInt[string]

	// 结构体泛型
	type Person[T int | string] struct {
		id T
		name string
	}
	
 // 接口泛型
	type PrintData[T int|string] interface {
		PrintFunc(data T)
	}
}

泛型方法和函数

type MySlice[T int | float64] []T

// 自定义泛型约束 ~ 表示当前类型的所有自定义类型也包含
type MyInt interface {
	int | int8 | ~int32
}

type MyInt32 int32

// 泛型方法  求和
func (arr MySlice[T]) Sum() T{
	var sum T
	for _, i := range arr {
		sum += i
	}
	return sum
}

// 泛型函数
func Add[T int | string | float64](a,b T) T {
	return a + b
}

// 泛型函数
func GetMax[T MyInt](a,b T) T {
	if a > b {
		return a
	}
	return b
}

func main() {
	var s1 MySlice[int] = []int{1,2,3,4,5}
	fmt.Println(s1.Sum())
	var s2 MySlice[float64] = []float64{1.1,2.2,3.3}
	fmt.Println(s2.Sum())
	
	// 调用泛型函数可以不声明类型
	fmt.Println(Add(2,3))
	fmt.Println(Add(2.2,3.3))
	
	var a int = 2
	var b int = 3
	fmt.Println(GetMax(a,b))

	var c MyInt32 = 12
	var d MyInt32 = 13
	fmt.Println(GetMax(c,d)) // 如果不加~ 这样会报错
}

标签:语言,float64,int,fmt,var,泛型,GO,string
From: https://www.cnblogs.com/kanx1blog/p/17013385.html

相关文章

  • MongoDB从入门到实战之Docker快速安装MongoDB
    前言   在上一篇文章中带领带同学们快速入门MongoDB这个文档型的NoSQL数据库,让大家快速的了解了MongoDB的基本概念。这一章开始我们就开始实战篇教程,为了快速把Mong......
  • <<你必须知道的495个C语言问题>>
    title:<<你必须知道的495个C语言问题>>categories:C书籍一.声明与初始化我该用哪种类型如果你定义明确的溢出特征,不想把正负号牵扯在内的话如果你希望操作二进制......
  • Springoot - 整合MyBatis
    1.导入JDBC驱动因为我的是Mysql数据库版本是8.0.20导入对应版本的驱动即可<!--mysql依赖--><dependency><groupId>mysql</groupId>......
  • go语言的控制反转 (IOC)在工程中应用
    背景最近在总结现有框架中一些比较有亮点的地方,个人觉得带着问题去学习是比较高效的事情,所以把一些学习总结记录下来。IoC是一种设计原理,比较常见于面向对象的设计中反转......
  • 第二章 探究新语言,快速入门Kotlin编程
    第二章探究新语言,快速入门Kotlin编程2.1Kotlin简介略2.2如何运行Kotlin代码(1)打开HelloWorld项目,找到MainActivity所在的位置(2)在MainActivity的同级包结构下创建一......
  • docker安装mongodb
    dockerrun-d\--namemongodb\--restartalways\--privileged\-p27017:27017\-v/data/mongodb/data:/data/db\-eMONGO_INITDB_ROOT_USERNAME......
  • Go-21 Golang接口详解
    packagemainimport"fmt"//Golang中的接口详解/* 1.接口的介绍 2.Golang接口的定义 3.空接口 4.类型断言 5.结构体值接收者和指针接收者实现接口的区别 6.一......
  • go语言知识点
    1.可以定义变量而不初始化,则变量默认零值(0/false/""),如vara;intfmt.Println(a)2.可以不指定变量类型,则系统根据变量的初始值判断变量类型。如vara=true3.变量作......
  • 【C++要笑着学】泛型编程 | 函数模板 | 函数模板实例化 | 类模板
      ​​​​​​    ......
  • 【维生素C语言】第四章 - 数组
     前言本章将对C语言的数组进行讲解,从一维数组开始讲起。已经学了三个章节了,所以本章还附加了三子棋和扫雷两个简单的小游戏,读者可以试着写一写,增加编程兴趣,提高模块化编程......