golang 泛型的格式写法

golang · 浏览次数 : 2

小编点评

Go语言中的泛型是一种重要的特性,它允许开发者编写可重用的代码,而不必针对每种数据类型重复相同的逻辑。泛型通过参数化类型实现,使得函数、方法、接口和结构体能够与多种类型协同工作。 ### 泛型函数的基本格式 泛型函数的基本格式包括以下几个部分: - `func functionName[TypeParameters constraints](arguments) returnType {`: 指定函数名、类型参数列表、类型约束、参数列表以及返回值类型。 - `TypeParameters`: 类型参数列表,用逗号分隔。 - `constraints`: 可选的类型约束,用于限制类型参数的可实例化类型。 - `arguments`: 函数参数列表,与非泛型函数一致。 - `returnType`: 函数的返回值类型,也可以是泛型类型。 ### 示例 以一个泛型的Max函数为例,该函数接受两个类型为T的参数,并返回较大的那个: ```go package main import ( "fmt" ) // 假设我们要编写一个泛型的 Max 函数,它可以接受两种类型的参数并返回较大的那个 type comparable interface { // 这里示例说明 T 必须是 int 或 float64 或 string 类型 } // 类型约束,用来限制类型参数可以被哪些具体类型实例化。 // 它可以是一个预定义的约束如 any(表示可以是任何类型),或者是自定义的接口约束。 func MyFunction[T any](t T) { // 函数体 } // 类型约束,要求 T 实现了 comparable 接口,意味着 T 可以用于比较操作。 // 注意这里的类型约束不能用 any,因为 T 默认情况下并不保证是可以比较的,会编译报错。 // 比如尝试对不支持的操作(如比较、算术运算)使用该类型参数时,会在编译时遇到错误。 func Max[T comparable](a, b T) T { if a > b { return a } return b } func main() { // 使用Max函数打印数值 PrintValue(42) // 输出: Value is: 42 // 使用Max函数比较两个整数值 fmt.Println(Max[int](1, 2)) // 输出: 2 // 使用Max函数比较两个浮点数值 fmt.Println(Max[float64](3.14, 2.71)) // 输出: 3.14 // 使用Max函数比较两个字符串 fmt.Println(Max[string]("apple", "banana")) // 输出: banana } ``` 在上面的示例中,`comparable` 是一个预定义的约束,表示这个类型参数需要是一个可以比较的类型,例如基本的数值类型或字符串等。 ### 结论 通过在函数、方法或接口中使用类型参数并添加类型约束,Go语言使得开发者能够创建高度可复用的代码。这样可以有效避免对于每种可能的数据类型都需要重新编写相似逻辑的问题,从而提高开发效率和代码质量。

正文

 

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

与golang 泛型的格式写法相似的内容:

golang 泛型的格式写法

Go语言中的泛型(Generics)是在 Go 1.18 版本中引入的一个重要特性,它允许你编写可重用的代码,而不需要为每种数据类型重复编写相同的逻辑。 泛型通过参数化类型(type parameters)来实现,使得函数、方法、接口和结构体可以与多种类型一起工作。 下面详细介绍Go语言中泛型的基本

Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire

本文从“术”层面,讲述“依赖注入”的实现,带你体会其对于整洁架构 & DDD 等设计思想的落地,起到的支撑作用。

[golang]在Gin框架中使用JWT鉴权

什么是JWT JWT,全称 JSON Web Token,是一种开放标准(RFC 7519),用于安全地在双方之间传递信息。尤其适用于身份验证和授权场景。JWT 的设计允许信息在各方之间安全地、 compactly(紧凑地)传输,因为其自身包含了所有需要的认证信息,从而减少了需要查询数据库或会话存储

golang如何使用指针灵活操作内存?unsafe包原理解析

本文将深入探讨Golang中unsafe包的功能和原理。同时,我们学习某种东西,一方面是为了实践运用,另一方面则是出于功利性面试的目的。所以,本文还会为大家介绍unsafe 包的典型应用以及高频面试题。

golang 所有关键字的列表及释义归类

golang 所有关键字的列表及释义归类,截至1.18版本。 [控制结构] if : 条件语句,基于布尔表达式的值决定是否执行特定的代码块。 else、 else if : 用在 if 语句之后,当条件表达式为假时执行的代码块。 switch : 多路选择语句,根据不同的情况执行不同的代码块。 ca

golang reflect 反射机制的使用场景

Go语言中的 reflect 包提供了运行时反射机制,允许程序在运行时检查和操作任意对象的数据类型和值。 以下是 reflect 包的一些典型使用场景: 1. 动态类型判断与转换:当需要处理多种类型的变量且具体类型直到运行时才能确定时,可以使用反射来检查变量的实际类型,并在可能的情况下进行类型转换。

golang sync.Map 与使用普通的 map 的区别

使用sync.Map与普通的Go map主要有以下几点区别: 1. 并发安全性 普通map: 在没有外部同步的情况下,不是并发安全的。在多goroutine访问时,如果没有适当的锁或其他同步机制保护,可能会导致数据竞争和未定义行为。 sync.Map: 是并发安全的。它内部实现了必要的同步机制,允许

golang sync.Once 保证某个动作仅执行一次的机制

type Once struct { done atomic.Uint32 m Mutex } 这段代码是 Go 语言标准库中 sync 包的一部分,定义了一个 Once 类型。Once 类型用于确保某个函数只被执行一次。它包含一个 done 原子类型和一个 Mutex 互斥锁。 done 表示动作

golang interface 和 struct 添加方法的区别

在 Go 语言中,struct 和 interface 都可以关联方法,但它们的方式不同: 1. struct 添加方法: 结构体(struct)本身不直接包含方法,但可以通过定义一个指向该结构体类型的指针作为接收者的函数来为结构体“添加”方法。 type MyStruct struct { //

golang 的 net/http 和 net/rpc 的区别, rpc 效率比 http 高?

在Go语言中,net/http 和 net/rpc 是两个不同的包,它们分别用于实现不同的网络通信模式: net/http: net/http 包主要用于构建Web服务和客户端,它实现了HTTP协议,这是互联网上最广泛使用的应用层协议之一,主要用于传输超文本(HTML)和其他资源。 HTTP 协议是