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
猜你喜欢
- 在程序中定义一个变量时,这个变量是有作用范围的,变量的作用范围被称为它的作用域。根据定义变量的位置,变量分为两种:局部变量:在函数中定义的变
- MYSQL数据库以它短小、方便、速度快、免费等优点成为很多网站目前首选数据库,但一般都是用PHP+MYSQL相结合来开发各种动态页面,其实A
- python内存管理机制:引用计数垃圾回收内存池1. 引用计数当一个python对象被引用时 其引用计数增加 1 ; 当其不再被变量引用时
- 前言相关性分析算是很多算法以及建模的基础知识之一了,十分经典。关于许多特征关联关系以及相关趋势都可以利用相关性分析计算表达。其中常见的相关性
- 一、 Scott用户下的表结构SCOTT。是在Oracle数据库中,一个示例用户的名称。其作用是为初学者提供一些简单的应用示例,不过其默认是
- #coding:utf-8 import urllib.request import xml.dom.minidom import sqli
- 大家还是直接看代码吧~netG = Generator()print('# generator parameters:',
- 在备份数据库的时候,数据表中可能存在这样的值array('a'='b','c'='d
- 目录1)连接请求的变量1、max_connections2、back_log3、wait_timeout和interative_timeou
- ipad的goodreader对JS文件支持不太好,虽然可以读取它但总是无法退出,回不了goodreader的主界面,因此我需要把js文件批
- mongodb是基于分布式文件存储的nosql(非关系型)数据库虽说是nosqldb, but mongodb 其中的文档可以是关系型的在m
- 前言我们知道,enigma机是德军二战中重要的情报加密机器,其有许多特点。首先,它是一台加解密一体机其次,它有排己性,虽然多次输入同一明文可
- 以该网站为例:https://www.17sucai.com/pins/demo-show?id=5926该网页下存在多个可供测试的下拉框。
- python中是区分大小写的,不管是变量、函数、还是类,都要严格的区分大小写。例如,page和Page是两个不同的变量,name和Name也
- 下面从以下四种方案分析各自的优缺点。方案一:SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;
- 本例使用登录页面演示,session的状态保持功能。说明:因为http是无状态的,客户端请求一次页面后,就结束了,当再次访问时,服务器端并不
- mysql中有三种日期类型:date(年-月-日)create table test(hiredate date);datetime(日期时
- 使用使用navicat连接远程linux mysql数据库出现10061未知故障,设置使用ssh连接后出现2013故障本机环境:win10
- mysql 8.0.20 安装配置方法图文教程整理下,供大家参考。一、准备工作1、检查是否已经安装mysql当前计算机没有安装mysql。2
- 安装conda activate ps pip install visdom激活ps的环境,在指定的ps环境中安装visdom开启pytho