Go语言入门11(泛型)

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

泛型

问题解决

一个计算sum的函数

func sum(slice []int) int {
	var res int
	for _, value := range slice {
		res += value
	}
	return res
}

​ 如果需要提供对int,float64,string三种数据类型的求sum函数,那么不使用泛型的情况下就需要单独写三个函数,此时就需要使用泛型这种概念,来避免重复代码出现

// 这里中括号中括起来的就是泛型的定义,将这三种数据类型定义为T泛型,同时使用T泛型来定义入参和返回值的数据类型
func Sum[T int | float64 | string](slice []T) T {
	var res T
	for _, value := range slice {
		res += value
	}
	return res
}
// 这样在调用函数的时候,只需要知道具体T泛型对应的是哪种数据类型,就可以确定入参和返回值的数据类型了
func main() {
	slice01 := []int{1, 2, 3}
	fmt.Printf("%d\n", Sum(slice01)) // 6
	slice02 := []float64{1.2, 2.2, 3.2}
	fmt.Printf("%.2f\n", Sum(slice02))  // 6.60
	slice03 := []string{"Hello", " ", "world!"}
	fmt.Printf("%s\n", Sum(slice03)) // Hello world!
}

泛型的使用

  1. 在函数传参中使用泛型

​ 同上一个例子相同,在函数声明中定义泛型,然后将他利用于入参,返回值,以及函数的内部定义

func Demo01[T int | string](input T) {
	fmt.Println(reflect.TypeOf(input))
}

func main() {
    // 通过传参来判断泛型T具体的数据类型
    // T:string
    Demo01("我是string类型") // string
    // T:int
    Demo01(123) // int
}
  1. 泛型结构体

​ 同样,泛型也适用于结构体,在结构体声明时定义泛型,既可以在结构体内部使用泛型来声明值的类型

// 使用泛型T来让生产日期的数据类型多样化,可以是int也可以是string
type robots[T int | string] struct {
	name             string
	yearOfProduction T
}

func Demo03() {
    // 使用带有泛型的结构体实例化对象的时候,要确定泛型T的具体类型
    // T:string
	myRobot01 := robots[string]{"robot01", "2023"}
    // T:int
	myRobot02 := robots[int]{"robot02", 2023}
	fmt.Printf("%T : %T\n", myRobot01.name, myRobot01.yearOfProduction) // string : string
	fmt.Println(myRobot01.name, " : ", myRobot01.yearOfProduction) // robot01  :  2023
	fmt.Printf("%T : %T\n", myRobot02.name, myRobot02.yearOfProduction) // string : int
	fmt.Println(myRobot02.name, " : ", myRobot02.yearOfProduction) // robot02  :  2023
}
  1. 给泛型添加方法

// 先声明带有泛型的切片slice[]
type Slice[T int | string | float64] []T

// 然后给这个切片添加方法
func (mySlice Slice[T]) Demo04() T {
	var res T
	for _, t := range mySlice {
		res += t
	}
	return res
}

func main() {
    // 再使用切片实例化对象时同样需要先确定泛型T的具体类型
	var slice01 Slice[int] = []int{1, 2, 3}
    // 直接使用里面的方法
	fmt.Printf("%d\n", slice01.Demo04())
	var slice02 Slice[float64] = []float64{1.2, 2.2, 3.2}
	fmt.Printf("%.2f\n", slice02.Demo04())
	var slice03 Slice[string] = []string{"Hello", " ", "world!"}
	fmt.Printf("%s\n", slice03.Demo04())
}
  1. 自定义泛型类型

​ 如果类型太多了怎么办呢?这时候我们就可以自定义泛型类型

// 声明方式类似接口
type MyInt interface{
    int | int8 | int16 | int32 | int64
}

// T的类型为声明的MyInt
func GetMax[T MyInt](a,b T) T {
    if a > b {
        return a
    }
    return b
}

特殊的泛型

go里内置了两个泛型类型:any和comparable

泛型类型 作用
any 表示go里面所有的内置基本类型,等价于interface{}
comparable 表示go里面所有内置的可以进行比较的类型

总结

​ 总而言之,这些初级用法,可以使代码变得非常的简洁,降低代码重复,在下面情景的时候非常适合使用泛型:当你需要针对不同类型书写同样的逻辑,使用泛型来简化代码是最好的文章来源地址https://www.toymoban.com/news/detail-423847.html

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

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

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

相关文章

  • go语言入门-一文带你掌握go语言函数

    本文go语言入门-掌握go语言函数收录于《go语言学习专栏》专栏,此专栏带你从零开始学习go语言。 在每一种编程语言中都有函数的概念,函数是基本的代码快,用于执行一个任务。 我们之前写的函数代码中,都包含一个main函数: 这个 main 就是一个函数的定义,包含了以下几

    2024年02月03日
    浏览(33)
  • 《c语言入门题目18》编写程序,创建一个4x4的矩阵,矩阵的值为{{1,2,4,5},{6,7,8,9},{10,11,12,13},{14,15,16,17}},显示该矩阵。求该矩阵的外围元素之和。

      前言:(内容仅供分享和参考): 提示:求三类元素的和,可以定义3 个不同的和变量,在遍历数组元素的循环中通过三次条件判分别进行三类元素的求和。设行下标为i,列下标为,考察三类元素的下标特征,外围元素要行下标i==0或者i==n-1(这里n为4)要么列下标j==0或者j=

    2024年02月03日
    浏览(41)
  • 【GO】go语言入门实战 —— 猜数字游戏

    程序介绍 首先生成一个介于1~100之间的随机数,然后提示玩家输入数字,并告诉玩家是猜对了还是猜错了,如果对了程序就结束,如果错了就提醒玩家是大了还是小了,然后玩家继续输入。 设置随机数 rand.Seed(seed int64) :播种 seed 为随机数种子 func time.Now() time.Time :获取当前

    2024年02月15日
    浏览(25)
  • go入门实践五-实现一个https服务

    在公网中,我想加密传输的数据。(1)很自然,我想到了把数据放到http的请求中,然后通过tls确保数据安全。(2)更进一步,只要数据可以解析,则无需http协议,直接通过tls协议加密传输即可。本文分别尝试了这两个方案。 尝试实现方案之前,我们考虑需要实现哪些内容。(1)如

    2024年02月12日
    浏览(26)
  • Go 泛型之泛型约束

    目录 Go 泛型之泛型约束 一、引入 二、最宽松的约束:any 三、支持比较操作的内置约束:comparable 四、自定义约束 五、类型集合(type set) 六、简化版的约束形式 七、约束的类型推断 八、小结 虽然泛型是开发人员表达“通用代码”的一种重要方式,但这并不意味着所有泛型

    2024年02月04日
    浏览(29)
  • go语言入门详细教程

    1.Hello World Go 是一门编译型语言,Go 语言的工具链将源代码及其依赖转换成计算机的机器指令(译注:静态编译)。Go 语言提供的工具都通过一个单独的命令 go 调用, go 命令有一系列子命令。最简单的一个子命令就是 run 。这个命令编译一个或多个以。 .go 结尾的源文件,链

    2024年02月04日
    浏览(55)
  • Go语言入门

    Go是一门由Google开发的开源编程语言,旨在提供高效、可靠和简洁的软件开发工具。Go具有静态类型、垃圾回收、并发性和高效编译的特点,适用于构建可扩展的网络服务和系统工具。本文将介绍Go语言的基础知识和常用功能,并通过示例代码和测试用例对其进行详细解释。

    2024年02月12日
    浏览(20)
  • Go 语言入门指南

    学一门语言先看看helloworld吧,感觉go结合了好多语言的方式,写起来一会像python一会像c++,java差不多。反正语法挺奇特 go语言特点: 高性能、高并发 语法简单,学习曲线平缓 丰富的标准库 完善的工具链 静态链接 快速编译 跨平台 垃圾回收 首先听到老师说 go语言编译贼快,

    2024年02月15日
    浏览(31)
  • go语言kafka入门

    消息队列:一种基于异步通信的解耦机制,用于在应用程序或系统组件之间传递消息和数据 消息队列相关概念: 生产者(Producer):生成并发送消息到消息队列中的应用程序或系统组件。 消费者(Consumer):从消息队列中接收和处理消息的应用程序或系统组件。 主题(Topi

    2024年02月10日
    浏览(24)
  • GO语言从入门到实战-Go语言简介:历史背景、发展现状及语言特性

    一、简述Go语言背景和发展         1. 软件开发的新挑战 多核硬件架构 超大规模分布式计算集群 Web 模式导致的前所未有的开发规模和更新速度         2. Go的三位创始人         Rob Pike         Unix 的早期开发者         UTF-8 创始人         Ken Thompson     

    2024年02月07日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包