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泛型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决golang.org不能访问的问题(推荐)

    解决golang.org不能访问的问题(推荐)

    这篇文章主要介绍了解决golang.org不能访问的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • golang代码检测工具之goimports解读

    golang代码检测工具之goimports解读

    这篇文章主要介绍了golang代码检测工具之goimports使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Go语言使用Redis和Etcd实现高性能分布式锁

    Go语言使用Redis和Etcd实现高性能分布式锁

    这篇文章主要为大家介绍了Go语言使用Redis实现高性能分布式锁示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Golang时间处理中容易踩的坑分析解决

    Golang时间处理中容易踩的坑分析解决

    这篇文章主要为大家介绍了Golang时间处理中容易踩的坑分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 浅谈go build后加文件和目录的区别

    浅谈go build后加文件和目录的区别

    这篇文章主要介绍了浅谈go build后加文件和目录的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言变量的声明实现示例

    Go语言变量的声明实现示例

    本文主要介绍了Go语言变量的声明实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Go单体服务开发最佳实践总结

    Go单体服务开发最佳实践总结

    这篇文章主要介绍了Go单体服务开发最佳实践,通过本文详细跟大家分享一下如何使用 go-zero 快速开发一个有多个模块的单体服务,需要的朋友可以参考下
    2022-04-04
  • vscode中安装Go插件和配置Go环境详细步骤

    vscode中安装Go插件和配置Go环境详细步骤

    要在VSCode中配置Go语言插件,首先需要确保你的电脑已经安装了Go环境和最新版本的VSCode,这篇文章主要给大家介绍了关于vscode中安装Go插件和配置Go环境的相关资料,需要的朋友可以参考下
    2024-01-01
  • Go递归修改文件名的实例代码

    Go递归修改文件名的实例代码

    这篇文章主要介绍了Go递归修改文件名的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的饿参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • go语言使用RC4加密的方法

    go语言使用RC4加密的方法

    这篇文章主要介绍了go语言使用RC4加密的方法,实例分析了RC4加密的技巧与实现方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论