前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022年03月22日 Go生态洞察:泛型介绍

2022年03月22日 Go生态洞察:泛型介绍

作者头像
猫头虎
发布2024-04-08 15:05:24
1350
发布2024-04-08 15:05:24
举报
文章被收录于专栏:用户11053981的专栏

2022年03月22日 Go生态洞察:泛型介绍

🐾 摘要

作为猫头虎博主,今天来聊聊Go语言的一个重大更新——泛型!在这篇文章里,我将深入探讨Go 1.18中引入的泛型功能。咱们不仅会涉及基础知识,还会深挖一些高级应用。如果你对Go的新特性感兴趣,别错过这次深入洞察!

🐾 引言

Go 1.18的发布带来了对泛型的支持,这是自Go首次开源发布以来的最大变化。泛型让代码能够独立于正在使用的特定类型。本文将介绍这一新特性的关键点,涵盖类型参数、类型集、类型推断等方面。

🐾 正文

🐅 泛型基础

泛型允许函数和类型使用一组类型。它在Go语言中添加了三大新内容:

  1. 函数和类型的类型参数。
  2. 将接口类型定义为类型集,包括没有方法的类型。
  3. 类型推断,允许在许多情况下在调用函数时省略类型参数。
🐅 类型参数

类型参数看起来像普通参数列表,但使用方括号而非圆括号。以下是一个基础的非泛型Min函数示例,用于比较浮点值:

代码语言:javascript
复制
func Min(x, y float64) float64 {
    if x < y {
        return x
    }
    return y
}

通过添加类型参数列表,我们可以将此函数变为泛型。例如,添加单个类型参数T并用T替换float64

代码语言:javascript
复制
import "golang.org/x/exp/constraints"

func GMin[T constraints.Ordered](x, y T) T {
    if x < y {
        return x
    }
    return y
}

现在,可以通过像x := GMin[int](2, 3)这样的调用来使用此函数。

🐅 类型集

类型参数列表中每个类型参数的类型定义了类型集。例如,泛型GMin中的Ordered约束描述了所有具有可排序值的类型集。在Go中,类型约束必须是接口。例如,interface{ int|string|bool }定义了包含intstringbool类型的类型集。

🐅 类型推断

类型推断是最复杂的语言变化之一。例如,函数参数类型推断允许从函数的参数推断出类型参数。另一种是约束类型推断,它从类型参数约束中推断出类型参数。

🐅 实践中的类型推断

虽然类型推断的细节复杂,但使用起来非常直接:类型推断要么成功,要么失败。如果成功,就可以省略类型参数,调用泛型函数就像调用普通函数一样。

🐅 代码示例

以下是一些实际的代码示例,展示了泛型在Go中的应用:

基础Min函数

代码语言:javascript
复制
func Min(x, y float64) float64 {
    if x < y {
        return x
    }
    return y
}

泛型GMin函数

代码语言:javascript
复制
import "golang.org/x/exp/constraints"

func GMin[T constraints.Ordered](x, y T) T {
    if x < y {
        return x
    }
    return y
}

类型推断应用

代码语言:javascript
复制
var a, b, m float64
m = GMin(a, b) // 无需类型参数
🐅 总结

泛型是Go 1.18中一个重大的新特性,尽管目前还没有在生产环境中得到大规模测试,

但我们相信这一功能的实现是高质量的。泛型的引入让Go程序员的工作变得更高效。

特性

描述

类型参数

允许函数和类型具有类型参数

类型集

接口定义为类型集,包括无方法的类型

类型推断

在许多情况下允许省略类型参数

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2022年03月22日 Go生态洞察:泛型介绍
    • 🐾 摘要
      • 🐾 引言
        • 🐾 正文
          • 🐅 泛型基础
          • 🐅 类型参数
          • 🐅 类型集
          • 🐅 类型推断
          • 🐅 实践中的类型推断
          • 🐅 代码示例
          • 🐅 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档