首页 > 其他分享 >Go: 泛型中`~`的用法

Go: 泛型中`~`的用法

时间:2024-05-19 11:08:21浏览次数:18  
标签:int PrintNumber fmt 别名 用法 泛型 类型 Go 约束

在Go语言的泛型中,~​ 符号用于类型约束中的类型推断。它允许你指定一个基础类型,并且约束类型参数必须是该基础类型或其别名。

基础类型约束

在Go泛型中,类型约束可以使用 ~​ 符号来表示基础类型。例如,如果你想要约束一个类型参数必须是 int​ 或者是 int​ 的别名类型,可以这样定义:

package main

import "fmt"

// 定义一个别名类型
type MyInt int

// 定义一个泛型函数,T 必须是 int 或 int 的别名类型
func PrintNumber[T ~int](n T) {
    fmt.Println(n)
}

func main() {
    var a int = 10
    var b MyInt = 20

    PrintNumber(a) // 输出: 10
    PrintNumber(b) // 输出: 20
}

在这个例子中,PrintNumber​ 函数使用了 ~int​ 作为类型约束,这意味着类型参数 T​ 可以是 int​ 或者是 int​ 的别名类型 MyInt​。

结合类型约束

你可以将 ~​ 符号与其他类型约束结合使用,以创建更复杂的约束。例如,约束一个类型参数必须是 int​ 或 float64​ 的基础类型或其别名:

package main

import (
    "fmt"
    "golang.org/x/exp/constraints"
)

// 定义一个别名类型
type MyFloat float64

// 定义一个泛型函数,T 必须是 int 或 float64 的基础类型或其别名
func PrintNumber[T ~int | ~float64](n T) {
    fmt.Println(n)
}

func main() {
    var a int = 10
    var b MyFloat = 20.5

    PrintNumber(a) // 输出: 10
    PrintNumber(b) // 输出: 20.5
}

在这个例子中,PrintNumber​ 函数使用了 ~int | ~float64​ 作为类型约束,这意味着类型参数 T​ 可以是 int​ 或 float64​ 的基础类型或其别名类型 MyFloat​。

使用 constraints​ 包

Go 1.18 引入了 constraints​ 包,其中包含一些常用的类型约束。你可以结合 ~​ 符号使用这些约束。例如,约束一个类型参数必须是有序类型的基础类型或其别名:

package main

import (
    "fmt"
    "golang.org/x/exp/constraints"
)

// 定义一个别名类型
type MyString string

// 定义一个泛型函数,T 必须是有序类型的基础类型或其别名
func Min[T ~constraints.Ordered](a, b T) T {
    if a < b {
        return a
    }
    return b
}

func main() {
    var a string = "apple"
    var b MyString = "banana"

    fmt.Println(Min(a, b)) // 输出: apple
}

在这个例子中,Min​ 函数使用了 ~constraints.Ordered​ 作为类型约束,这意味着类型参数 T​ 可以是有序类型的基础类型或其别名类型 MyString​。

标签:int,PrintNumber,fmt,别名,用法,泛型,类型,Go,约束
From: https://www.cnblogs.com/pDJJq/p/18200141/go-the-usage-of-the-generic-1vhstd

相关文章

  • 连接池设计与实现一——以Golang Http1.1为例
    0.前言连接池是一个非常重要的开发思想,如httpclient会构建连接池复用底层TCP连接,使用database/sql的使用也会有连接池的配置。那么代码底层是如何实现连接池的呢?这篇文档将以Golang语言为基础,分析http1.1连接池底层实现★注意:我们仅仅关注连接池设计思想、以及关键源码解读,......
  • 2024-05-18:用go语言,给定一个从 0 开始的字符串 s,以及两个子字符串 a 和 b,还有一个整数
    2024-05-18:用go语言,给定一个从0开始的字符串s,以及两个子字符串a和b,还有一个整数k。定义一个“美丽下标”,当满足以下条件时:1.找到字符串a在字符串s中的位置,且该位置范围为0<=i<=s.length-a.length。2.找到字符串b在字符串s中的位置,且该位置范围为0<=j......
  • Linux/Golang/glibC系统调用
    Linux/Golang/glibC系统调用本文主要通过分析Linux环境下Golang的系统调用,以此阐明整个流程有时候涉略过多,反而遭到质疑~,写点文章证明自己实力也好Golang系统调用找个函数来分析https://pkg.go.dev/os/exec#Cmd.Wait源码文件在src/os目录下的:exec.go->exec_unix.go->......
  • Django测试与持续集成:从入门到精通
    title:Django测试与持续集成:从入门到精通date:2024/5/1816:38:41updated:2024/5/1816:38:41categories:后端开发tags:Django测试CI/CD优化部署监控迭代第1章:Django测试基础1.1Django测试框架概述Django测试框架是Djangoweb框架的一部分,提供了一个强......
  • Go设置代理
    打开终端cmdgoenv启用GoModules功能goenv-wGO111MODULE=on配置GOPROXY环境变量,以下三选一1.七牛CDNgoenv-wGOPROXY=https://goproxy.cn,direct2.阿里云goenv-wGOPROXY=https://mirrors.aliyun.com/goproxy/,direct3.官方goenv-wGOPROXY=https:......
  • Django markdown 实现
    一、安装markdown插件pipinstalldjango-mdeditorpipinstallmarkdown二、在settings配置文件INSTALLED_APPS中添加mdeditor:INSTALLED_APPS=[...'mdeditor',]三、插入图片没有地址,针对django3.0+修改frame配置,settings.py设置如下:......
  • django中使用celery
    通用方案将自定义的celery的包拉到django项目根目录在celery.py文件内导入django的环境变量这样才能正常启动worker或者beatfromceleryimportCeleryimporttimeimportos#必须要将django的环境变量加进去(在manage.py中复制)os.environ.setdefault('DJANGO_SETTINGS_M......
  • 使用django_celery_beat在admin后台配置计划任务
    使用步骤安装包pipinstalldjango-celery-beatapp注册app注册INSTALLED_APPS=[....'django_celery_beat',]配置文件:屏蔽原来的调度器CELERY_BEAT_SCHEDULER='django_celery_beat.schedulers.DatabaseScheduler'设置时区LANGUAGE_CODE='z......
  • python计算机视觉学习笔记——PIL库的用法
    如果需要处理的原图及代码,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice这个是之前的笔记,自己看到了就顺带发出来,也是温习一下,内容可能不太全,算是入门贴吧。前言:PIL 图像处理是计算机视觉领域中......
  • PaliGemma 正式发布 — Google 最新发布的前沿开放视觉语言模型
    PaliGemma是Google推出的新一代视觉语言模型家族,能够接收图像与文本输入并生成文本输出。Google团队已推出三种类型的模型:预训练(PT)模型、混合模型和微调(FT)模型,这些模型分辨率各异,提供多种精度以便使用。所有模型均在HuggingFaceHub的模型库中发布,配备了模型说明和许可证......