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

相关推荐
Pandaconda20 分钟前
【Golang 面试题】每日 3 题(三十九)
开发语言·经验分享·笔记·后端·面试·golang·go
加油,旭杏24 分钟前
【go语言】变量和常量
服务器·开发语言·golang
行路见知24 分钟前
3.3 Go 返回值详解
开发语言·golang
编程小筑1 小时前
R语言的编程范式
开发语言·后端·golang
技术的探险家1 小时前
Elixir语言的文件操作
开发语言·后端·golang
Ai 编码助手1 小时前
Golang 中强大的重试机制,解决瞬态错误
开发语言·后端·golang
齐雅彤2 小时前
Lisp语言的区块链
开发语言·后端·golang
齐雅彤2 小时前
Lisp语言的循环实现
开发语言·后端·golang
梁雨珈2 小时前
Lisp语言的物联网
开发语言·后端·golang
邓熙榆3 小时前
Logo语言的网络编程
开发语言·后端·golang