golang 泛型的格式写法

Go语言中的泛型(Generics)是在 Go 1.18 版本中引入的一个重要特性,它允许你编写可重用的代码,而不需要为每种数据类型重复编写相同的逻辑。

泛型通过参数化类型(type parameters)来实现,使得函数、方法、接口和结构体可以与多种类型一起工作。

下面详细介绍Go语言中泛型的基本格式和用法:

泛型函数的基本格式如下:

复制代码
func functionName[TypeParameters constraints](arguments) returnType {
    // 函数体
}

functionName: 是泛型函数的名字。

TypeParameters: 是类型参数列表,放在函数名后的方括号中,用逗号分隔多个类型参数。每个类型参数代表一个待定的类型。

constraints: 是类型约束,可选,用来限制类型参数可以被哪些具体类型实例化。它可以是一个预定义的约束如any(表示可以是任何类型),或者是自定义的接口约束。

arguments: 是函数的参数列表,与非泛型函数相同。

returnType: 是函数的返回类型,同样可以是泛型类型。

类型约束用来限制类型参数可以被哪些类型实例化。

你可以使用预定义的约束,如 any(等同于空接口interface{},可以匹配任何类型),或者定义自己的接口约束。

自定义类型约束的示例:

复制代码
type MyConstraint interface {
    // 这里列出约束条件,比如必须实现的方法
    SomeMethod()
}

func MyFunction[T MyConstraint](t T) {
    // 函数体
}

【示例】

假设我们要编写一个泛型的 Max 函数,它可以接受两种类型的参数并返回较大的那个:

复制代码
package main

import (
    "fmt"
)


type comparable interface {
    ~int | ~float64 | ~string // 这里示例说明 T 必须是 int 或 float64 或 string 类型
}

// 类型约束,用来限制类型参数可以被哪些具体类型实例化。
// 它可以是一个预定义的约束如 any(表示可以是任何类型),或者是自定义的接口约束。
func PrintValue[T any](value T) {
    fmt.Println("Value is:", value)
}

// 类型约束,要求 T 实现了 comparable 接口,意味着 T 可以用于比较操作。
// 注意这里的类型约束不能用 any,因为 T 默认情况下并不保证是可以比较的,会编译报错。
// 比如尝试对不支持的操作(如比较、算术运算)使用该类型参数时,会在编译时遇到错误。
func Max[T comparable](a, b T) T {
    if a > b {
        return a
    }
    return b
}

func main() {
    PrintValue(42)    // 输出: Value is: 42

    fmt.Println(Max[int](1, 2))    // 输出: 2
    fmt.Println(Max[float64](3.14, 2.71)) // 输出: 3.14
    fmt.Println(Max[string]("apple", "banana")) // 输出: banana
}

在这个例子中,comparable 是一个预定义的约束,表示这个类型参数需要是一个可以比较的类型,比如基本的数值类型、字符串等。

Link:https://www.cnblogs.com/farwish/p/18242833

相关推荐
ん贤11 小时前
如何加快golang编译速度
后端·golang·go
riverz122712 小时前
Go 程序无法使用 /etc/resolv.conf 的 DNS 配置排查记录
golang
As_wind_16 小时前
Go 语言学习之测试
开发语言·学习·golang
linweidong1 天前
Go语言时间控制:定时器技术详细指南
后端·golang·go定时器·go开发·go面试·go分布式·go timer
一条闲鱼_mytube2 天前
gin go-kratos go-zero框架对比
开发语言·golang·gin
come112342 天前
Go 包管理工具详解:安装与使用指南
开发语言·后端·golang
西京刀客3 天前
构建 Go 可执行文件镜像 | 探索轻量级 Docker 基础镜像(我应该选择哪个 Docker 镜像?)
开发语言·docker·golang
007php0073 天前
服务器上PHP环境安装与更新版本和扩展(安装PHP、Nginx、Redis、Swoole和OPcache)
运维·服务器·后端·nginx·golang·测试用例·php
祁许4 天前
【Golang】GORM - GEN工具 快速开始
开发语言·golang
showyoui4 天前
深入Go语言之slice:不只是动态数组
后端·golang·slice·切片