首页 > 其他分享 >Golang 泛型及代码示例

Golang 泛型及代码示例

时间:2023-12-07 10:05:59浏览次数:29  
标签:string 示例 int Golang 类型 func 泛型 xs


以下是一个包含 Golang 泛型代码示例的文件:

package main

import (
    "fmt"
    "sort"
)

// 泛型函数
func Add[T any](x, y T) T {
    return x + y
}

func main() {
    // 将两个整数相加
    fmt.Println(Add(1, 2)) // 3

    // 将两个字符串相加
    fmt.Println(Add("Hello", "World")) // HelloWorld

    // 泛型类型
    type List[T any] []T

    // 创建一个存储整数的列表
    var intList List[int]
    intList = []int{1, 2, 3}

    // 创建一个存储字符串的列表
    var strList List[string]
    strList = []string{"Hello", "World"}

    // 泛型约束
    func Sort[T comparable](xs []T) {
        sort.Slice(xs, func(i, j int) bool {
            return xs[i] < xs[j]
        })
    }

    // 使用泛型约束来排序整数列表
    Sort(intList)
    fmt.Println(intList) // [1 2 3]

    // 使用泛型类型集合来简化泛型约束
    func Sort[T int | string](xs []T) {
        sort.Slice(xs, func(i, j int) bool {
            return xs[i] < xs[j]
        })
    }

    // 使用泛型类型集合来排序整数和字符串列表
    Sort(strList)
    fmt.Println(strList) // [Hello World]
}

该文件包含以下代码示例:

  • Add() 是一个泛型函数,可以将两个任意类型的值相加。
  • List() 是一个泛型类型,可以存储任意类型的值。
  • Sort() 是一个泛型函数,可以对任意类型的列表进行排序。

Golang 泛型是在 Go 1.18 中引入的新功能,允许我们在函数、类型和接口中使用类型参数。泛型可以帮助我们简化代码,提高代码的复用性和可维护性。

以下是一些 Golang 泛型代码示例:

泛型函数

泛型函数可以接受任意类型的参数。例如,以下函数可以将两个值相加,无论它们的类型是什么:

func Add[T any](x, y T) T {
    return x + y
}

例如,我们可以使用该函数来将两个整数相加:

fmt.Println(Add(1, 2)) // 3

或将两个字符串相加:

fmt.Println(Add("Hello", "World")) // HelloWorld

泛型类型

泛型类型可以存储任意类型的值。例如,以下类型定义了一个泛型列表:

type List[T any] []T

我们可以使用该类型来创建一个存储整数的列表:

var intList List[int]
intList = []int{1, 2, 3}

或创建一个存储字符串的列表:

var strList List[string]
strList = []string{"Hello", "World"}

泛型约束

泛型约束可以用于限制类型参数的范围。例如,以下函数接受一个泛型函数,该函数接受两个 Comparable 类型的参数:

func Sort[T comparable](xs []T) {
    sort.Slice(xs, func(i, j int) bool {
        return xs[i] < xs[j]
    })
}

Comparable 是一个接口,它只包含一个方法 Compare()

type Comparable interface {
    Compare(other interface{}) int
}

该接口确保函数接受的泛型函数可以安全地对其参数进行比较。

泛型类型集合

泛型类型集合可以用于简化泛型约束的使用。例如,以下函数接受一个泛型函数,该函数接受两个 intstring 类型的参数:

func Sort[T int | string](xs []T) {
    sort.Slice(xs, func(i, j int) bool {
        return xs[i] < xs[j]
    })
}

我们可以使用 int | string 来表示 intstring 的类型集合。

泛型最佳实践

在使用泛型时,需要注意以下最佳实践:

  • 使用泛型可以简化代码,但也可能会使代码更加复杂。在使用泛型之前,请仔细考虑是否值得使用。
  • 使用泛型约束可以限制类型参数的范围,从而确保代码的安全性。
  • 使用泛型类型集合可以简化泛型约束的使用。

泛型是一种强大的新功能,可以帮助我们编写更简洁、更高效的 Go 代码。


标签:string,示例,int,Golang,类型,func,泛型,xs
From: https://blog.51cto.com/zhangxueliang/8718150

相关文章

  • Golang unsafe.Pointer类型代码示例
    指针类型基本代码示例在Go语言中,指针类型用于存储变量的内存地址。通过指针,我们可以直接访问和修改变量的值。下面是一些关于指针类型的示例代码:packagemainimport"fmt"funcmain(){//声明一个整数变量并赋值num:=10fmt.Println("原始值:",num)/......
  • Golang unsafe.Sizeof 函数代码示例
    在Go语言中,可以使用unsafe.Sizeof()函数来获取变量或类型的大小(以字节为单位)。下面是一个示例代码,演示如何使用unsafe.Sizeof()函数:packagemainimport( "fmt" "unsafe")typePersonstruct{ Namestring Ageint}funcmain(){ varnumint varstrstring......
  • Golang runtime包代码示例
    在Go中,runtime包提供了与运行时系统(runtimesystem)交互的功能。这个包包含了一些底层的运行时操作,例如内存管理、协程管理、垃圾回收等。以下是一个简单的示例代码,展示了runtime包的一些常见用法:packagemainimport( "fmt" "runtime")funcmain(){ //获取Go程序......
  • Golang GC是标记清除GC算法吗?与复制算法、标记整理算法的区别
    Golang(Go语言)使用的是标记清除(MarkandSweep)的垃圾回收(GC)算法。下面是标记清除算法与复制算法以及标记整理算法之间的区别和优势:标记清除算法(MarkandSweep):工作原理:标记清除算法分为标记和清除两个阶段。首先,从根对象(如全局变量、堆栈中的对象)开始,标记所有可以访问到的对象。然后......
  • Golang标准库:非类型安全操作(Arbitrary 类型 Pointer 类型 Sizeof 函数 Offsetof 函数)
    unsafe库徘徊在“类型安全”边缘,由于它们绕过了Golang的内存安全原则,一般被认为使用该库是不安全的。但是,在许多情况下,unsafe库的作用又是不可替代的,灵活地使用它们可以实现对内存的直接读写操作。在reflect库、syscall库以及其他许多需要操作内存的开源项目中都有对它的引用。un......
  • 通过PowerShellPlus示例脚本学习PowerShell之-通过SMO获取SQLServer数据库
    ##=====================================================================##Title:Get-MSSQL-DB-UsingSMO##Description:ShowalldatabasesusingSMOforagivenserverinstance##Author:Idera##Date:1/28/2008##Input:-s......
  • golang的try catch 方式
    列子如下:main.go 1try.Catch(func(errerror){2//异常处理3fmt.Println(err)4}).Then(func()error{5//执行代码16//...78//如果有异常即抛出异常9returnnil10}).Then(func()error{11//执行代码212/......
  • cerbos golang 内部policy check 处理简单说明
    主要是想尝试实现一个rust的check方法,所以先研究下golang的内部实现CheckResourcesfunc(cs*CerbosService)CheckResources(ctxcontext.Context,req*requestv1.CheckResourcesRequest)(*responsev1.CheckResourcesResponse,error){log:=logging.......
  • jsmn示例使用
    前言jsmn是一款超级精简的c语言json解释器,用于嵌入式进行json数据解析特别友好。官方库:https://github.com/zserge/jsmn/tree/masterjsmn(pronouncedlike'jasmine')isaminimalisticJSONparserinC.Itcanbeeasilyintegratedintoresource-limitedorembedde......
  • golang的蓝牙通信库
    github.com/tinygo-org/bluetooth:TinyGo是一个Go语言编译器,它专注于微控制器和小型计算机系统。这个库是TinyGo项目的一部分,用于支持蓝牙低功耗(BLE)设备。github.com/go-ble/ble:这是一个轻量级的Golang库,旨在简化与蓝牙低功耗设备的交互。它支持多种平台,并提供了一种简单的A......