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

相关文章

  • GoFrame实现顺序性校验示例详解

    GoFrame实现顺序性校验示例详解

    这篇文章主要为大家介绍了GoFrame实现顺序性校验示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • go项目中环境变量的配置

    go项目中环境变量的配置

    本文主要介绍了go项目中环境变量的配置,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • 入门学习Go的基本语法

    入门学习Go的基本语法

    这篇文章主要介绍了Go语法的基本概念,本文讲解了Golang的基本知识、基础语法、相关术语等,需要的朋友可以参考下,希望能帮助到你
    2021-07-07
  • Go语言流程控制之goto语句与无限循环

    Go语言流程控制之goto语句与无限循环

    这篇文章主要介绍了Go语言流程控制之goto语句与无限循环,是golang入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • 解决Golang在Web开发时前端莫名出现的空白换行

    解决Golang在Web开发时前端莫名出现的空白换行

    最近在使用Go语言开发Web时,在前端莫名出现了空白换行,找了网上的一些资料终于找到了解决方法,现在分享给大家,有需要的可以参考。
    2016-08-08
  • golang 随机数的两种方式

    golang 随机数的两种方式

    本文主要介绍了golang 随机数的两种方式,一种是伪随机,另一种是真随机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 深入理解Go语言中接口的使用

    深入理解Go语言中接口的使用

    在现代编程语言中,接口是不可或缺的一个重要特性,这篇文章将为大家详细介绍Go语言中的接口,从而能够更好得使用Go语言,需要的可以参考一下
    2023-06-06
  • 向Rust学习Go考虑简单字符串插值特性示例解析

    向Rust学习Go考虑简单字符串插值特性示例解析

    这篇文章主要为大家介绍了向Rust学习Go考虑简单字符串插值特性示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • golang配置管理神器Viper使用教程

    golang配置管理神器Viper使用教程

    这篇文章主要为大家介绍了golang配置管理神器Viper使用教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Go语言中实现Unix风格的进程管道方法实例

    Go语言中实现Unix风格的进程管道方法实例

    这篇文章主要为大家介绍了Go语言中实现Unix风格的进程管道方法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论