go语法入门泛型type parameters简称T(类型形参)两种场景使用

 更新时间:2023年09月06日 09:38:27   作者:海生  
这篇文章主要为大家介绍了go语法入门泛型type parameters简称T(类型形参)两种场景使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、介绍

go在1.18终于加上了泛型。那么在之前,我们都没有用10几年了,一直用。

加上泛型后,到底好处在哪里呢,解决了那些场景的痛点呢?

泛型主要在于归纳,泛型-代表可以多余一种类型。

作为入门的文章,主要介绍两种泛型的使用场景

泛型允许在函数和类型的实现中使用某个类型集合中的任何一种类型。

目前 “类型形参” (type parameters),简称 T

  • 面向函数,作为参数
  • 面向结构体,作为结构体里面字段的类型

1.1 面向函数,作为参数

我们来看一下,在比较两个数的大小时,没有泛型的时候,仅仅只是传入类型不一样,我们就要再写一份一模一样的函数。

// maxInt64 获取j,j中的最大值
func maxInt64(i, j int64) int64 {
    if i >= j {
        return i
    }
    return j
}
// maxInt32 获取j,j中的最大值
func maxInt32(i, j int32) int32 {
    if i >= j {
        return i
    }
    return j
}

此时代码的逻辑一样,只是类型不一样,我们可以使用“类型形参” (type parameters),简称 T 来代表int32或者int64

类型形参type parameters简称T语法为:

[T int32 | int64]

这样的语法,我们用 类型形参T来代表int32或者int64类型。

上面的

maxInt64(i, j int64) int64
maxInt32(i, j int32) int32

我们使用 类型形参T来替换为:

func maxInt32orInt62[T int32 | int64](i, j T) T {
    if i >= j {
        return i
    }
    return j
}
func TestMaxInt32orInt62(t *testing.T) {
    var i1, j1 int32 = 1, 3
    t.Log(maxInt32orInt62(i1, j1))
    var i2, j2 int64 = 11, 3
    t.Log(maxInt32orInt62(i2, j2))
}

输出:

=== RUN   TestMaxInt32orInt62
    3
    11
--- PASS: TestMaxInt32orInt62 (0.00s)

在参数方面 i, j的类型变为T,以及返回值的类型也是 T因为我么在前面定义了

[T int32 | int64]

用T来代表int32或者int64.

1.2 面向结构体,作为结构体里面字段的类型

我们先看一下正常结构体的写法如下:

type sumInt struct {
    Num int64
}
func (s sumInt) Sum() int64 {
    return s.Num
}
type sumFloat struct {
    Num float64
}
func (s sumFloat) Sum() float64 {
    return s.Num
}
func TestSumIntOrFloat(t *testing.T) {
    i := sumInt{Num: 100}
    t.Log(i.Sum())
    f := sumFloat{Num: 100.0}
    t.Log(f.Sum())
}

输出:

=== RUN   TestSumIntOrFloat
    100
    100
--- PASS: TestSumIntOrFloat (0.00s)

我们发现Num的类型为int64float64,我们在这里准备用“类型形参” (type parameters),简称 T来代替他们。

[T int64 | float64]

修改为如下:

type sumIntOrFloat[T int64 | float64] struct {
    Num T
}
func (s sumIntOrFloat[T]) Sum() T {
    return s.Num
}
func TestSumIntOrFloat(t *testing.T) {
    i := sumIntOrFloat[int64]{Num: 100}
    t.Log(i.Sum())
    f := sumIntOrFloat[float64]{Num: 100.0}
    t.Log(f.Sum())
}

输出:

=== RUN   TestSumIntOrFloat
    100
    100
--- PASS: TestSumIntOrFloat (0.00s)

以上就是go语法入门泛型type parameters简称T(类型形参)两种场景使用的详细内容,更多关于go泛型type parameters的资料请关注脚本之家其它相关文章!

相关文章

  • go 分布式锁简单实现实例详解

    go 分布式锁简单实现实例详解

    这篇文章主要为大家介绍了go 分布式锁简单实现实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Go语言学习笔记之golang操作MongoDB数据库

    Go语言学习笔记之golang操作MongoDB数据库

    MongoDB是Nosql中常用的一种数据库,这篇文章主要给大家介绍了关于Go语言学习笔记之golang操作MongoDB数据库的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Golang中如何对MySQL进行操作详解

    Golang中如何对MySQL进行操作详解

    这篇文章主要给大家介绍了关于在Golang中如何对MySQL进行操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Golang具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 利用rpm打包上线部署golang代码的方法教程

    利用rpm打包上线部署golang代码的方法教程

    RPM是RPM Package Manager(RPM软件包管理器)的缩写,这篇文章主要给大家介绍了关于利用rpm打包上线部署golang代码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Golang实现Md5校验的代码示例

    Golang实现Md5校验的代码示例

    最近项目中有个需求,就是地图文件下发后,接收方需要文件的md5值,和接收到的文件做比对,以免文件不完整,引起bug,于是测试了下本地文件和远程文件的md5计算,所以本文给大家介绍了Golang实现Md5校验,需要的朋友可以参考下
    2024-07-07
  • Go实现基于RSA加密算法的接口鉴权

    Go实现基于RSA加密算法的接口鉴权

    这篇文章主要介绍了Go实现基于RSA加密算法的接口鉴权,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Golang中类型转换利器cast库的用法详解

    Golang中类型转换利器cast库的用法详解

    cast库是一个简洁而强大的第三方库,它的主要功能是实现类型之间的安全转换,而在Golang开发中,类型转换是一个常见且不可避免的过程,下面我们就来看看cast库在Golang中的具体应用吧
    2024-11-11
  • 深入理解Go语言中的Dispatcher

    深入理解Go语言中的Dispatcher

    最近看到了Go语言中的Dispatcher,但是在网上发现资料非常少,所以想着总结处理分享给大家,下面这篇文章主要给大家深入的介绍Go语言中Dispatcher的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-03-03
  • Go语言 channel如何实现归并排序中的merge函数详解

    Go语言 channel如何实现归并排序中的merge函数详解

    这篇文章主要给大家介绍了关于Go语言 channel如何实现归并排序中merge函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-02-02
  • GoRoutines高性能同时进行多个Api调用实现

    GoRoutines高性能同时进行多个Api调用实现

    这篇文章主要为大家介绍了GoRoutines高性能同时进行多个Api调用实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论