Go1.18都出泛型了速来围观

 更新时间:2022年03月17日 14:12:34   作者:jiangxiaoju  
泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型,本文通过例子给大家介绍下如何使用泛型,对Go1.18泛型相关知识感兴趣的朋友一起看看吧

go泛型使用的官方说明:https://go.dev/doc/tutorial/generics

在使用之前先把go更新到1.18或者以上的版本:https://go.dev/doc/install

如果用过c++或者Java的话,那么对泛型这个概念应该是不陌生的。(下面这段定义摘抄自百度百科)
泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。

我们可以用个简单的例子来看看如何使用泛型。

在没有泛型之前,如果我们要写一个比较大小的函数的话,因为go里面没有函数重载的概念,所以我们必须对需要比较的类型都创建一个比较函数,不过这样的话,就会有大量逻辑重复的代码,他们的区别只是变量的类型不同罢了。

package main

import "fmt"
func MaxInt(a, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}
func MaxFloat32(a, b float32) float32 {
func main() {
	var a, b int
	var c, d float32
	a = 1
	b = 2
	c = 1.1
	d = 1.4
	fmt.Println(MaxInt(a, b))
	fmt.Println(MaxFloat32(c, d))

那么泛型该如何使用呢?
go预留了一个泛型,名为comparable,这是官方定义的一个可比较的类型约束

// comparable is an interface that is implemented by all comparable types
// (booleans, numbers, strings, pointers, channels, arrays of comparable types,
// structs whose fields are all comparable types).
// The comparable interface may only be used as a type parameter constraint,
// not as the type of a variable.
//翻译如下
//comparable是由所有可比较类型实现的接口
//(布尔、数字、字符串、指针、通道、类似类型的数组、,
//字段均为可比较类型的结构)。
//可比接口只能用作类型参数约束,
//不是作为变量的类型。
type comparable interface{ comparable }

我们可以来自己声明一个类型约束。

type Number interface {
	int | int32 | int64 | float32
}

如上定义表示如果参数类型要为intint32int64float32这四个类型其中一个的适合,可以用Number替代。
所以我们可以把最初比较大小的代码进行修改、简化一下。

package main

import "fmt"
type Number interface {
	int | int32 | int64 | float32
}
func MaxNumber[K Number](a K, b K) K {
	if a > b {
		return a
	} else {
		return b
	}
func main() {
	var a, b int
	var c, d float32
	a = 1
	b = 2
	c = 1.1
	d = 1.4
	fmt.Println(MaxNumber(a, b))
	fmt.Println(MaxNumber(c, d))

在函数名后面用在中括号中使用类型约束,这时候在函数里面K就表示Number这个类型约束,然后可以用在函数的参数列表、函数体、返回值中。

加入需要用到以int或者float32等基本类型为基础的类型时,例如type MyInt int,需要在类型名前面加上~

type Number interface {
 	~int   
}

如果不加的话,使用时会出现如下错误提示

# generics-demo
.\main.go:23:23: MyInt does not implement Number (possibly missing ~ for int in constraint Number)

到此这篇关于Go1.18都出泛型了,不来试试看?的文章就介绍到这了,更多相关Go1.18泛型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言遍历目录的三种方法举例

    Go语言遍历目录的三种方法举例

    学习io之后,尤其是文件操作,我们就可以遍历给定的目录了,这篇文章主要给大家介绍了关于Go语言遍历目录的三种方法,分别是ioutil.ReadDir、filepath.Walk以及filepath.Glob,需要的朋友可以参考下
    2023-11-11
  • 深入理解Go中的项目代码布局

    深入理解Go中的项目代码布局

    Go 语言的创世项目其实就是 Go 语言项目自身,是全世界第一个 Go 语言项目,本文主要来和大家详细介绍一下Go中的项目代码布局,需要的可以了解下
    2023-11-11
  • Go Slice进行参数传递如何实现详解

    Go Slice进行参数传递如何实现详解

    这篇文章主要为大家介绍了Go Slice进行参数传递如何实现的过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go工具链之代码测试神器go test详解

    Go工具链之代码测试神器go test详解

    这篇文章主要给大家介绍Go 工具链go test,go test 是 Go 工具链中的一个命令,用于编译和运行按照要求编写的 Golang 测试代码,并生成测试报告,感兴趣的同学跟着小编一起来看看本文吧
    2023-07-07
  • 解析Golang中的锁竞争问题

    解析Golang中的锁竞争问题

    这篇文章主要介绍了golang中的锁竞争问题,本文通过实例代码给大家详细讲解,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Golang中Options模式的使用

    Golang中Options模式的使用

    选项模式是一种设计模式,允许通过提供选项自定义行为,Golang中的应用广泛,尤其是库和框架设计中,本文深入探讨Golang中选项模式的实现,包括函数选项和结构体选项两种方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • Golang交叉编译(跨平台编译)的使用

    Golang交叉编译(跨平台编译)的使用

    本文主要介绍了Golang交叉编译(跨平台编译)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Go使用MongoDB的操作指南(增删改查)

    Go使用MongoDB的操作指南(增删改查)

    MongoDB 是一种高性能、开源、文档型的 NoSQL 数据库,广泛应用于 Web 应用、大数据以及云计算领域,Go 语言则以其快速、开发效率高、代码可维护性强著称,本指南将详细介绍如何在 Go 语言中使用 MongoDB 进行数据库操作,需要的朋友可以参考下
    2024-08-08
  • 详解go-micro微服务consul配置及注册中心

    详解go-micro微服务consul配置及注册中心

    这篇文章主要为大家介绍了go-micro微服务consul配置及注册中心示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • GO语言原生实现文件上传功能

    GO语言原生实现文件上传功能

    这篇文章主要为大家详细介绍了GO语言原生实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论