首页 > 其他分享 >golang之泛型

golang之泛型

时间:2023-12-11 09:04:26浏览次数:28  
标签:代码 使用 golang 泛型 参数 类型 之泛 Go

Go 1.18版本增加了对泛型的支持,泛型也是自 Go 语言开源以来所做的最大改变。

 

泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。ーー换句话说,在编写某些代码或数据结构时先不提供值的类型,而是之后再提供。

泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。

 

Go1.18之前我们可以尝试使用反射去解决上述问题,但是使用反射在运行期间获取变量类型会降低代码的执行效率并且失去编译期的类型检查,同时大量的反射代码也会让程序变得晦涩难懂。

示例:

func reverseWithGenerics[T any](s []T) []T {
    l := len(s)
    r := make([]T, l)

    for i, e := range s {
        r[l-i-1] = e
    }
    return r
}

 

语法:

泛型为Go语言添加了三个新的重要特性:

  1. 函数和类型的类型参数。
  2. 将接口类型定义为类型集,包括没有方法的类型。
  3. 类型推断,它允许在调用函数时在许多情况下省略类型参数。

 

 借助泛型,我们可以声明一个适用于一组类型min函数。

 

实例化使用:

fmin := min[float64] // 类型实例化,编译器生成T=float64的min函数
m2 = fmin(1.2, 2.3)  // 1.2

 

类型参数的使用

除了函数中支持使用类型参数列表外,类型也可以使用类型参数列表。

type Slice[T int | string] []T

type Map[K int | string, V float32 | float64] map[K]V

type Tree[T interface{}] struct {
    left, right *Tree[T]
    value       T
}

 

 

 

 

参考文章: https://www.liwenzhou.com/posts/Go/generics/

 

标签:代码,使用,golang,泛型,参数,类型,之泛,Go
From: https://www.cnblogs.com/xingxia/p/golang_generics.html

相关文章

  • golang按换行符一行一行读取GBK文件
    packageawesomeProject1import( "bufio" "fmt" "github.com/axgle/mahonia" "io" "log" "os")funcmain(){ filename:="/tmp/test.txt" readTbkByLine(filename)}funcreadTbkBy......
  • beego框架 golang web项目-个人博客系统
    beego框架golangweb项目-个人博客系统beego个人博客系统功能介绍首页分页展示博客博客详情评论文章专栏分类导航资源分享时光轴点点滴滴关于本站后台管理登录系统设置分类添加修改删除管理博文添加修改删除管理基于Go语言和beego框架前端使用layui布局开发的......
  • Golang标准库:syslog包代码示例
    以下是一个示例代码,展示了如何使用syslog包进行系统日志记录:packagemainimport( "log" "log/syslog")funcmain(){ //创建一个连接到本地系统日志的写入器 writer,err:=syslog.New(syslog.LOG_INFO,"Example") iferr!=nil{ log.Fatal("Failedtoconnect......
  • Golang标准库:expvar 包代码示例
    expvar包提供了一种在运行时公开程序内部变量的方法,以便进行监控和调试。以下是一个示例代码,展示了如何使用expvar包:packagemainimport( "expvar" "fmt" "net/http")funcmain(){ //定义一个expvar.Int变量 counter:=expvar.NewInt("counter") //设置一个......
  • Golang os包代码示例:获取命令行参数、获取环境变量、创建和删除文件、检查文件或目录
    以下是一些示例代码,展示了如何使用os包进行操作系统相关的操作:获取命令行参数:packagemainimport( "fmt" "os")funcmain(){ args:=os.Args fori,arg:=rangeargs{ fmt.Printf("Argument%d:%s\n",i,arg) }}获取环境变量:packagemainimport( "f......
  • Golang标准库:runtime/debug 包代码示例
    runtime/debug包提供了与运行时调试和诊断相关的功能。以下是一个示例代码,展示了如何使用runtime/debug包的一些功能:packagemainimport( "fmt" "runtime/debug")funcmain(){ //获取当前goroutine的栈跟踪信息 stackTrace:=debug.Stack() //打印栈跟踪信息......
  • Golang flag包:命令行参数解析入门代码示例
    以下是一个示例代码,展示了如何使用flag包处理命令行参数:packagemainimport( "flag" "fmt")funcmain(){ //定义命令行参数对应的变量 varnamestring varageint varisAdminbool //绑定命令行参数与变量 flag.StringVar(&name,"name","","En......
  • Golang flag包:nginx命令行参数解析代码示例
    flag-命令行参数解析在写命令行程序(工具、server)时,对命令参数进行解析是常见的需求。各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。如果命令行参数纯粹自己写代码解析,对于比较复杂的,还是挺费劲的。在go标准库中提供了一个包:flag,方便进行命令行解析。注:区分......
  • Golang 泛型及代码示例
    以下是一个包含Golang泛型代码示例的文件:packagemainimport("fmt""sort")//泛型函数funcAdd[Tany](x,yT)T{returnx+y}funcmain(){//将两个整数相加fmt.Println(Add(1,2))//3//将两个字符串相加fmt.Println(Add(......
  • Golang unsafe.Pointer类型代码示例
    指针类型基本代码示例在Go语言中,指针类型用于存储变量的内存地址。通过指针,我们可以直接访问和修改变量的值。下面是一些关于指针类型的示例代码:packagemainimport"fmt"funcmain(){//声明一个整数变量并赋值num:=10fmt.Println("原始值:",num)/......