Go语言的泛型是在Go 1.18版本中引入的一个新特性,它允许开发者编写可以处理不同数据类型的代码,而无需为每种数据类型都编写重复的代码。以下是关于Go语言泛型的一些关键点:

  1. 泛型是通过在函数或类型定义中使用类型参数来实现的。类型参数可以被看作是一个特殊的类型,它可以在函数或类型定义中的任何位置使用。
  2. 在函数或类型定义中,类型参数的列表是在名称后面的方括号中给出的。例如,在函数定义 func PrintSlice[T any](s []T) {...} 中,T 是一个类型参数,any 是它的约束。
  3. 约束定义了类型参数可以接受的类型范围。例如,any 约束允许类型参数接受任何类型,包括内置类型、接口类型、结构体类型等。
  4. 你可以定义自己的约束,通过定义一个接口类型,然后在类型参数列表中使用它。类型参数必须满足这个接口的所有方法。
  5. Go语言的泛型是在编译时实现的,这意味着所有的类型检查都是在编译时进行的,而不是在运行时。
  6. Go语言的泛型提供了代码复用和类型安全的优点,但是它也可能导致编译时间增加和生成的二进制文件变大。

以下是一些使用Go语言泛型的示例:

1. 泛型函数

接受一个类型参数T,并返回T类型的切片中的第一个元素。

package main

import "fmt"

func First[T any](s []T) (T, bool) {
if len(s) == 0 {
var zero T
return zero, false
}
return s[0], true
} func main() {
fmt.Println(First[int]([]int{1, 2, 3}))
fmt.Println(First[string]([]string{"Hello", "World"}))
}

2. 泛型类型

定义了一个可以存储任何类型元素的栈。

package main

import "fmt"

type Stack[T any] []T

func (s *Stack[T]) Push(v T) {
*s = append(*s, v)
} func (s *Stack[T]) Pop() (T, bool) {
if len(*s) == 0 {
var zero T
return zero, false
}
index := len(*s) - 1
element := (*s)[index]
*s = (*s)[:index]
return element, true
} func main() {
s := Stack[int]{}
s.Push(1)
s.Push(2)
s.Push(3)
fmt.Println(s.Pop())
fmt.Println(s.Pop())
fmt.Println(s.Pop())
}

3. 自定义约束

定义了一个函数,该函数接受一个实现了Stringer接口的类型参数。

package main

import (
"fmt"
"strconv"
) type Stringer interface {
String() string
} func Print[T Stringer](s T) {
fmt.Println(s.String())
} type MyInt int func (m MyInt) String() string {
return strconv.Itoa(int(m))
} func main() {
Print[MyInt](MyInt(10))
}

在这个例子中,Print函数接受一个实现了Stringer接口的类型参数。MyInt类型实现了Stringer接口,所以我们可以将MyInt类型的值传递给Print函数。


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

author: mengbin

blog: mengbin

github: mengbin92

cnblogs: 恋水无意


Go泛型简介的更多相关文章

  1. C# 泛型简介

    摘要:本文讨论泛型处理的问题空间.它们的实现方式.该编程模型的好处,以及独特的创新(例如,约束.一般方法和委托以及一般继承).此外,本文还讨论 .NET Framework 如何利用泛型. 下载 Ge ...

  2. Java基础之集合框架类及泛型简介

    Collection接口 Collection 通用的常见方法 add()添加一个元素,可以指定脚标 addAll()将一个collection放入 clear()清除 remove()删除元素,返回 ...

  3. Java学习:泛型简介

    泛型 泛型:是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型 泛型也可以看出是一个变量,用来接受数据类型 E e : Element 元素 T t : Type 类型 Array ...

  4. java 泛型简介(转载)

    原文出处: absfree 1. Why ——引入泛型机制的原因 假如我们想要实现一个String数组,并且要求它可以动态改变大小,这时我们都会想到用ArrayList来聚合String对象.然而,过 ...

  5. C# 泛型约束

    一.泛型简介1.1泛型通过使用泛型,可以创建这样的类.接口和方法,它们以一种类型安全的工作方式操作各种数据.本质上,术语“泛型”指的是“参数化类型”(parameterized types).参数化类 ...

  6. C# 集合与泛型

    一.古典集合方式 在C#2.0的时候集合主要通过两种方式实现: 1.使用ArrayList实现 新建ArrayList,然后将所有对象放入该数组中,简单直接,但缺点是该数组什么类型的元素都能接收,在实 ...

  7. Java笔记--泛型总结与详解

    泛型简介: 在泛型没有出来之前,编写存储对象的数据结构是很不方便的.如果要针对每类型的对象写一个数据结构,     则当需要将其应用到其他对象上时,还需要重写这个数据结构.如果使用了Object类型, ...

  8. .net泛型理解

    泛型简介: 泛型(Generic Type)是.NET Framework2.0最强大的功能之一.泛型的主要思想是将算法与数据结构完全分离开,使得一次定义的算法能作用于多种数据结构,从而实现高度可重用 ...

  9. 转载.net泛型理解说明

    net泛型理解 泛型简介: 泛型(Generic Type)是.NET Framework2.0最强大的功能之一.泛型的主要思想是将算法与数据结构完全分离开,使得一次定义的算法能作用于多种数据结构,从 ...

  10. Java中泛型区别以及泛型擦除详解

    一.引言 复习javac的编译过程中的解语法糖的时候看见了泛型擦除中的举例,网上的资料大多比较散各针对性不一,在此做出自己的一些详细且易懂的总结. 二.泛型简介 泛型是JDK 1.5的一项新特性,一种 ...

随机推荐

  1. 无法获得数据库 'model' 上的排他锁。请稍后重试该操作

    标题: Microsoft SQL Server Management Studio 数据库 "XXXX" 的 创建 失败. (Microsoft.SqlServer.Smo) 有 ...

  2. SpringBoot 引用仓库中没有 第三方包 - 将jar 包安装本地 maven

    命令如下: mvn install:install-file -Dfile="D:\Projects\lib\com.ibm.mq-7.0.1.3.jar" -DgroupId=c ...

  3. Mac 修改文件默认打开方式

    Mac 播放 swf Flash文件 选中文件,Command+i 打开简介 不过文件图标还没变过来.重新下明天再看看

  4. python+requests+unittest+htmltestrunner+Excel生成接口自动化的测试框架

    Python+Requests+Unittest+Excel+HtmltestRunner生成自动化测试框架 流程 1.接口文档 2.读取接口文档 3.封装request的类 4.unittest类 ...

  5. Spring | 利用Maven搭建Spring的开发环境

    本节主要介绍如何利用Maven搭建 Spring 开发环境,使用 Spring 之前需要安装 JDK .Maven和 IDEA 建议一定要从 Maven 项目开始,而不是从空项目开始,空项目开始会出现 ...

  6. vivo商城前端架构升级—多端统一探索、实践与展望篇

    一.引言 本文将会从整体上介绍 vivo 商城在前端维度的多端统一探索和实践. 从多端价值.为什么要做多端统一.如何满足多端业务需求.实践与创新,简洁直白的阐述我们在多端统一上所做的一切. 二.多端探 ...

  7. Spring自带的Objects等工具类(减少繁琐代码)

    断言: AssertUtils assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert 断言工具类,通常 ...

  8. rabbitMq消息持久化机制,和延时队列

    1.RabbitMQ的一大特色是消息的可靠性,那么它是如何保证消息可靠性的呢? 消息持久化.可以将Queue,Exchange,Message都设置为可持久化的.为了保证RabbitMQ在退出,服务重 ...

  9. <vue 路由 5、动态路由-标签上传递参数>

    一.效果 在about页面点击"我的",路径里传入了参数zhangsan,在"我的"页面里接收传递过来的张三并展现出来.注:标签中传递参数写法 二.代码结构 注 ...

  10. 《3D编程模式》写书-第2次记录

    大家好,目前我已经完成了"拼接模式"."撤销重做模式"."ECS模式"的初稿 下面会给出它们的使用场景,如果您正好能用到,请联系我提前阅读模 ...