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的资料请关注脚本之家其它相关文章!

相关文章

  • Golang简单实现http的server端和client端

    Golang简单实现http的server端和client端

    Http 服务是基于 Tcp 的应用层的实现,也是最常见的网络协议之一。本文主要介绍了Golang简单实现http的server端和client端,感兴趣的可以了解一下
    2021-06-06
  • Go 结构体序列化的实现

    Go 结构体序列化的实现

    本文主要介绍了Go 结构体序列化的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Golang实现心跳机制的示例详解

    Golang实现心跳机制的示例详解

    这篇文章主要为大家详细介绍了Golang实现心跳机制的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-04-04
  • Golang拾遗之实现一个不可复制类型详解

    Golang拾遗之实现一个不可复制类型详解

    在这篇文章中我们将实现一个无法被复制的类型,顺便加深对引用类型、值传递以及指针的理解。文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-02-02
  • Go实现文件分片上传

    Go实现文件分片上传

    这篇文章主要为大家详细介绍了Go实现文件分片上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Go语言地址引用的问题解决

    Go语言地址引用的问题解决

    本文主要介绍了Go语言中channel和slice的引用行为,它们在操作时会共享同一块数据,及在追加数据时可能开辟新内存的情况,下面就来详细的介绍一下,感兴趣的可以了解一下
    2025-11-11
  • Golang内存管理之内存分配器详解

    Golang内存管理之内存分配器详解

    Go内存分配器的设计思想来源于TCMalloc,全称是Thread-Caching Malloc,核心思想是把内存分为多级管理,下面就来和大家深入聊聊Go语言内存分配器的使用吧
    2023-06-06
  • Golang开发动态库的实现

    Golang开发动态库的实现

    这篇文章主要介绍了Golang开发动态库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Go 实现英尺和米的简单单位换算方式

    Go 实现英尺和米的简单单位换算方式

    这篇文章主要介绍了Go 实现英尺和米的简单单位换算方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • GoLand 使用自定义包的实现步骤

    GoLand 使用自定义包的实现步骤

    包是Go语言中代码组成和代码编译的主要方式,本文主要介绍了GoLand 使用自定义包的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06

最新评论