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. 打通数据治理全链路,火山引擎DataLeap数据治理平台公有云版本正式发布

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   近日,火山引擎DataLeap正式对外发布数据治理平台公有云版.DataLeap是火山引擎大数据研发治理套件, ...

  2. Solon2 的 Bean 生命周期

    Solon 框架的 Bean 是被容器托管的,所以它的生命周期只限定在容器内部: 时机点 说明 补充 AopContext::new() 是在应用初始化时执行 ::new() AopContext:: ...

  3. logback.xml 配置文件

    logback.xml <?xml version="1.0" encoding="UTF-8"?> <configuration> & ...

  4. 极限五分钟,在宝塔中用 Docker 部署升讯威在线客服系统

    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可. 客户组 ...

  5. 如何优雅的在 Word 中添加漂亮的代码?

    Step 01 第一步,在编程软件里找到你想要放进Word文档里的代码,复制下来. Step 02 第二步,打开Notepad++,将代码直接粘贴. Step 03 第三步,这个时候的代码是没有任何格 ...

  6. Codeforces Round #723 (Div. 2) (A~C题题解)

    补题链接:Here 1526A. Mean Inequality 给定 \(2 * n\) 个整数序列 \(a\),请按下列两个条件输出序列 \(b\) 序列是 \(a\) 序列的重排序 \(b_i ...

  7. L1-018 大笨钟 (10分)

    开始天梯赛专项训练 微博上有个自称"大笨钟V"的家伙,每天敲钟催促码农们爱惜身体早点睡觉.不过由于笨钟自己作息也不是很规律,所以敲钟并不定时.一般敲钟的点数是根据敲钟时间而定的,如 ...

  8. spring中这些编程技巧,真的让我爱不释手

    前言 最近越来越多的读者认可我的文章,还是挺让人高兴的.有些读者希望我多分享spring方面的知识点,能够在实际工作中派的上用场.我对spring的源码有过一定的研究,结合我这几年实际的工作经验,把s ...

  9. win32com操作word API精讲 第八集 Range和Selection的区别

    本课程<win32com操作word API精讲&项目实战>以视频为主,文字为辅,公众号ID:一灯编程 众所周知,在word编程中Range和Selection都能实现范围的选中, ...

  10. vscode如何优雅的拥抱eslint

    https://www.toutiao.com/a6826129210260587019/?tt_from=weixin&utm_campaign=client_share&wxsha ...