当前位置: 首页 > wzjs >正文

孝感 网站建设佛山网站搜索排名

孝感 网站建设,佛山网站搜索排名,wordpress 精致主题,ps毕业设计做网站界面constraints 是 Go 1.18 引入泛型时提供的一个标准包(位于 golang.org/x/exp/constraints),它定义了一组常用的类型约束接口,用于泛型编程中对类型参数进行限制。基本概念constraints 包提供了一系列预定义的约束(cons…

constraints 是 Go 1.18 引入泛型时提供的一个标准包(位于 golang.org/x/exp/constraints),它定义了一组常用的类型约束接口,用于泛型编程中对类型参数进行限制。

基本概念

constraints 包提供了一系列预定义的约束(constraints),这些约束实际上是接口类型,用于指定泛型类型参数必须满足的条件。

主要约束类型

1. 基本约束

  • Signed - 所有有符号整数类型
  • int, int8, int16, int32, int64
// 反转整数符号(正负互换)
func InvertSign[T constraints.Signed](n T) T {return -n
}func main() {fmt.Println(InvertSign(-5))  // 输出: 5fmt.Println(InvertSign(10))  // 输出: -10
}
  • Unsigned - 所有无符号整数类型
  • uint, uint8, uint16, uint32, uint64, uintptr
// 检查是否偶数
func IsEven[T constraints.Unsigned](n T) bool {return n%2 == 0
}func main() {fmt.Println(IsEven(uint(4)))  // 输出: truefmt.Println(IsEven(uint(7)))  // 输出: false
}
  • Integer - 所有整数类型(Signed + Unsigned)
  • int, uint8, int64
// 计算整数平方
func Square[T constraints.Integer](n T) T {return n * n
}func main() {fmt.Println(Square(5))      // 输出: 25 (int)fmt.Println(Square(uint8(3))) // 输出: 9 (uint8)
}
  • Float - 所有浮点数类型
  • float32, float64
// 浮点数四舍五入到整数
func Round[T constraints.Float](f T) int {return int(math.Round(float64(f)))
}func main() {fmt.Println(Round(3.14))  // 输出: 3fmt.Println(Round(2.78))  // 输出: 3
}
  • Complex - 所有复数类型
  • complex64, complex128
// 计算复数模长(|a + bi| = √(a² + b²))
func Magnitude[T constraints.Complex](c T) float64 {r := real(c)i := imag(c)return math.Sqrt(r*r + i*i)
}func main() {c := complex(3.0, 4.0) // 3+4ifmt.Println(Magnitude(c)) // 输出: 5 (直角三角形的斜边)
}

2. 常用组合约束

  • Ordered - 所有可比较大小(支持 <<=>>=)的类型
  • int, string, float64
// 返回两值中的较大值
func Max[T constraints.Ordered](a, b T) T {if a > b {return a}return b
}func main() {fmt.Println(Max(10, 20))          // 输出: 20fmt.Println(Max("apple", "banana")) // 输出: "banana"(按字典序)
}
  • comparable - 内置约束,所有可比较相等性(支持 == 和 !=)的类型
// 检查值是否在切片中存在
func Contains[T comparable](slice []T, target T) bool {for _, v := range slice {if v == target {  // 依赖 == 操作符return true}}return false
}func main() {names := []string{"Alice", "Bob", "Charlie"}fmt.Println(Contains(names, "Bob"))    // 输出: truefmt.Println(Contains(names, "David"))   // 输出: false
}

使用示例

1. 使用 Ordered 约束

import "golang.org/x/exp/constraints"func Max[T constraints.Ordered](a, b T) T {if a > b {return a}return b
}// 可以用于整数、浮点数、字符串等
fmt.Println(Max(1, 2))           // 2
fmt.Println(Max(3.14, 2.71))    // 3.14
fmt.Println(Max("apple", "banana")) // "banana"

2. 自定义约束组合

type Number interface {constraints.Integer | constraints.Float
}func Sum[T Number](a, b T) T {return a + b
}fmt.Println(Sum(1, 2))       // 3
fmt.Println(Sum(1.5, 2.5))   // 4.0
// fmt.Println(Sum("a", "b")) // 编译错误:string 不满足 Number 约束

3.代替方案(无需 constraints 包)

如果不想依赖实验包,可直接内联约束

// 等效于 constraints.Ordered
type Ordered interface {~int | ~int8 | ~int16 | ... // 手动列出所有支持的类型
}// 等效于 constraints.Signed
type Signed interface {~int | ~int8 | ~int16 | ~int32 | ~int64
}

表格总结

约束描述示例类型
Signed所有有符号整数intint8int64
Unsigned所有无符号整数uintuintptr
Integer所有整数类型intuint8
Float所有浮点数float32float64
Complex所有复数complex64complex128
Ordered可排序类型(支持 < >intstringfloat64
Comparable可比较类型(支持 == !=)(注:Go 内置了 comparable

 完整案例示例

package mainimport ("fmt""golang.org/x/exp/constraints"
)// 泛型函数:求最小值(要求类型可排序)
func Min[T constraints.Ordered](a, b T) T {if a < b {return a}return b
}// 泛型函数:数字绝对值(要求为有符号整数或浮点数)
func Abs[T constraints.Signed | constraints.Float](x T) T {if x < 0 {return -x}return x
}func main() {fmt.Println(Min(3, 5))      // 3fmt.Println(Min("a", "b"))  // "a"fmt.Println(Abs(-4.5))      // 4.5
}

注意事项

1.constraints 包目前仍在实验阶段(在 `golang.org/x/exp` 下),未来可能会调整

2.~ 符号表示包含底层类型的类型,例如:

   type MyInt int// ~int 包括 int 和所有以 int 为底层类型的类型(如 MyInt)

3. Go 1.18 内置了两个特殊约束:

  • any - 等同于 interface{},任何类型
  • comparable - 所有可比较的类型

4.实际开发中,如果 constraints 包中的约束不满足需求,可以自定义约束:

   type Stringish interface {string | fmt.Stringer}

为什么需要 constraints

Go 的泛型设计强调类型安全,约束机制可以:

  1. 明确泛型函数/类型可接受的具体类型
  2. 在泛型函数体内明确知道类型参数支持哪些操作
  3. 提供更好的编译时类型检查
  4. 生成更高效的机器代码

constraints 包提供了一组经过精心设计的常用约束,避免了开发者重复定义这些基本约束。

与直接定义类型的区别是什么

1. 代码复用性

  • 直接定义类型 针对每种类型重复实现逻辑:
 func AddInt(a, b int) int { return a + b }func AddFloat(a, b float64) float64 { return a + b }

问题:相同逻辑需为不同类型编写多次,冗余且难维护。

  • 泛型 用类型参数 T 编写通用代码:
  func Add[T int | float64](a, b T) T { return a + b }

优势:一份代码支持多种类型,减少重复。

2. 类型安全

  • 直接定义类型 类型固定,安全但缺乏灵活性:
  AddInt(1, 2) // 正确AddInt(1.5, 2) // 编译错误
  • 泛型 编译时类型检查确保安全:
  Add(1, 2)        // T=intAdd(1.5, 2.0)    // T=float64Add("a", "b")    // 编译错误(类型不满足约束)

优势:在复用代码的同时保持类型安全。

案例对比

直接定义类型(冗余)

type IntStack struct { data []int }
func (s *IntStack) Push(v int) { s.data = append(s.data, v) }type StringStack struct { data []string }
func (s *StringStack) Push(v string) { ... } // 重复实现

泛型(复用)

type Stack[T any] struct { data []T }
func (s *Stack[T]) Push(v T) { s.data = append(s.data, v) }// 使用
var s1 Stack[int]     // 存储 int
var s2 Stack[string]  // 存储 string
http://www.dtcms.com/wzjs/498574.html

相关文章:

  • 汽贸公司网站建设seo搜索优化工具
  • 十大旅游网站排名论坛推广案例
  • 建设规范文件在哪个网站发布中国百强城市榜单
  • 郑州网站制作公司汉狮深圳网络推广网站推广
  • 福建网站建设公百度提交入口网站网址
  • 蒲城做网站曼联目前积分榜
  • 建个商城网站需要多少钱湖北百度seo
  • 北理工网站开发与运用常州免费网站建站模板
  • 什么软件可以发布做网站如何在百度发布信息
  • 公司网站域名注册费用黄山网站seo
  • 网站建设人力资源分配google seo怎么做
  • 网站限时抢购怎么做seo蜘蛛屯
  • 苏州网站制作排名优化seo优化平台
  • 网站开发的方法有哪些seo是什么职位缩写
  • 帮别人做网站开什么内容的专票互联网营销师培训
  • 服装官网网站建设b2b电子商务网站
  • 广州知名网站建设网页设计服务网络营销薪酬公司
  • 河南网站建设公司首页关键词排名优化
  • 小网站建设公司线上商城的推广方案
  • 中国移动网络优化做什么的天津seo优化公司
  • 西安招聘网最新招聘搜索引擎营销优化的方法
  • 网站建设 开发 模板百度知道个人中心
  • 阜阳建设委员会网站关键词优化到首页怎么做到的
  • 网站建设工程结算方式百度一下首页
  • 建站网站企业网站建设目标
  • 优秀产品设计北京seo顾问推推蛙
  • 苏州网站建设培训学校幽默广告软文案例
  • 淘宝店铺运营14个seo小技巧
  • 网站运营与管理的对策今日广州新闻最新消息
  • 固定ip如何做网站服务器沈阳今日新闻头条