Go1.18新特性之泛型使用三步曲(小结)
作者:Go学堂 发布时间:2024-05-03 15:05:52
01 Go中的泛型是什么
众所周知,Go是一门静态类型的语言。静态类型也就意味着在使用Go语言编程时,所有的变量、函数参数都需要指定具体的类型,同时在编译阶段编译器也会对指定的数据类型进行校验。这也意味着一个函数的输入参数和返回参数都必须要和具体的类型强相关,不能被不同类型的数据结构所复用。
而泛型就是要解决代码复用和编译期间类型安全检查的问题而生的。这里给出我理解的泛型的定义:
泛型是静态语言中的一种编程方式。这种编程方式可以让算法不再依赖于某个具体的数据类型,而是通过将数据类型进行参数化,以达到算法可复用的目的。
下面,我们通过一个函数的传统编写方式和泛型编写方式先来体验一下。
1.1 传统的函数编写方式
例如,我们有一个函数Max,其功能是计算整型切片中的最大元素,则其传统的编写方式如下:
func Max(s []int) int {
if len(s) == 0 {
return 0
}
max := s[0]
for _, v := range s[1:] {
if v > max {
max = v
}
}
return max
}
m1 := Max([]int{4, -8, 15})
在该示例中,Max函数的输入参数和返回值类型已经被指定都是int类型,不能使用其他类型的切片(例如s []float)。如果想要获取float类型的切片中的最大元素,则需要再写一个函数:
func MaxFloat(s []float) float {
//...
}
传统的编写方式的缺点就是需要针对每一种类型都要编写一个函数,除了函数的参数中的类型不一样,其他逻辑完全一样。
接下来我们看看使用泛型的写法。
1.2 泛型函数编写方式
为了能够使编写的程序更具有可复用性,通用编程(Generic programming)也应运而生。使用泛型,函数或类型可以基于类型参数进行定义,并在调用该函数时动态指定具体的类型对其进行实例化,以达到函数或类型可以基于一组定义好的类型都能使用的目的。我们通过泛型将上述Max函数进行改写:
import (
"fmt"
"golang.org/x/exp/constraints"
)
func main() {
m1 := Max[int]([]int{4, -8, 15})
m2 := Max[float64]([]float64{4.1, -8.1, 15.1})
fmt.Println(m1, m2)
}
// 定义泛型函数
func Max[T constraints.Ordered](s []T) T {
var zero T
if len(s) == 0 {
return zero
}
var max T
max = s[0]
for _, v := range s[1:] {
max = v
if v > max {
max = v
}
}
return max
}
由以上示例可知,我们通过使用泛型改写了MaxNumber函数,在main函数中调用MaxNumber时,通过传入一个具体的类型就能复用MaxNumber的代码了。
来源:https://juejin.cn/post/7087951131510308901


猜你喜欢
- 目录项目地址所用到的技术开始编写爬虫项目地址https://github.com/aliyoge/fund_crawler_py所用到的技术
- 现在的需求是:下拉框中要是选择加盟商让其继续选择学校,要是选择平台管理员则不需要选择学校。隐藏选择下拉列表。选择枚举值:/// <su
- 要写爬虫爬取大量的数据,就会面临ip被封的问题,虽然可以通过设置延时的方法来延缓对网站的访问,但是一旦访问次数过多仍然会面临ip被封的风险,
- 类视图使用装饰器为类视图添加装饰器,可以使用两种方法。为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作
- 调用sklearn的model_selection时,发现sklearn中没有model_selection的模块。经过检查,发现anaco
- 话不多说,请看代码------------------------------------------作者:张欣宇-----时间:2013-
- pandas.read_csv()遇到读进来乱码问题1.设置encoding='gbk'或者encoding='ut
- 在一篇文章中看到关于PHP引用的图解,对于加深对PHP引用的理解很有帮助,在这里备份一下。如果你对PHP的引用一点也不了解,可以先看我之前的
- 如下所示:RuntimeError: stack expects each tensor to be equal size, but got
- 注意:本文基于Python2.4完成;如果看到不明白的词汇请记得百度谷歌或维基,whatever。 1. 正则表达式基础 1.1. 简单介绍
- 第一步:登陆root用户。第二步:新建一个数据表,并且选好排序规则,此处我使用testtable。第三步:我们新建一个用户输入相关的账户名以
- 这篇文章主要介绍了Python搭建HTTP服务过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 引言众所周知,在python中我们用try…except…来捕获异常,使用raise来抛出异常,
- 准备软件:1. J2SDK(1.5.0): jdk-1_5_0-linux-i586-rpm.bin2. Apache(2.0.53): h
- 简介Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。你可以将它理解成脚本语言,大多情况我也是将它作为写脚本工具
- 在 .NET Framework 2.0中,ConfigurationManager类新增了两个属性AppSe
- JavaScript使用if () { ... } else { ... }来进行条件判断。例如,根据年龄显示不同内容,可以用if语句实现如
- 在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了
- 不了解的同学先“点这里”看看什么是Firebug。简单来说,Firebug是Firefox上用来监视、编辑和调试站点的CSS、HTML、DO
- 本文实例为大家分享了python实现图片转字符画的具体代码,供大家参考,具体内容如下源码(注释很详细):# -*- coding=utf-8