Golang泛型语法

简介: 在定义函数(结构等)时候,可能会有多种类型传入。只有在真正使用才知道是什么类型,此时就可以用一个更加宽泛的类型(必须存在一定约束,只能在那些类型的范围内使用)暂时占位。这个类型就叫泛型

一、泛型基本含义


在定义函数(结构等)时候,可能会有多种类型传入。只有在真正使用才知道是什么类型,此时就可以用一个更加宽泛的类型(必须存在一定约束,只能在那些类型的范围内使用)暂时占位。这个类型就叫泛型


写法:[泛型标识 泛型约束] ([T int | float64 | string])


二、通过内置的约束来实现


1、any


使用any约束,实现一个简单的函数


//官网文档解释:any是接口{}的别名,在所有方面等价于接口{},可以匹配所有类型
func same[T any](a, b T) bool {
  return a == b
}
func main() {
    fmt.Println(same(1, 1))        //true
    fmt.Println(same(1.1, 2.1))    //false
  fmt.Println(same("1", "10"))   //false
}


2、comparable


使用 comparable 约束类型。 comparable 是一个编译器内置的特定的扩展接口类型,该类型必须支持“==“ 方法。


//官方文档:comparable是由所有可比类型实现的接口(布尔值、数字、字符串、指针、通道、
//可比类型数组、结构的字段都是可比较的类型)。可比接口只能用作类型参数约束,不是变量的类型。
func Sum[K comparable, V int | float64](m map[K]V) V {
  var s V
  for _, v := range m {
    s += v
  }
  return s
}
func main() {
  ints := map[string]int{
    "first":  34,
    "second": 12,
  }
  floats := map[string]float64{
    "first":  35.98,
    "second": 26.99,
  }
    //Ints=46 Floats=62.97
  fmt.Printf("Ints=%v Floats=%v\n", Sum(ints), Sum(floats))
}


三、泛型方法


//泛型方法 在方法调用的时候去判断是泛型约束(int|float64|string)里的哪一种
func same[T int | float64 | string](a, b T) bool {
  return a == b
}
func main() {
    //隐式声明 自动转为 same[int](1, 1)
    fmt.Println(same(1, 1))        //true
  fmt.Println(same[int](1, 1))   //显式声明 true
    fmt.Println(same(1.1, 2.1))    //false
  fmt.Println(same("1", "10"))   //false
}


四、泛型结构体:


//泛型结构体 结构体声明的就要定义类型 [T any]表示所以类型都接收
type Person[T any] struct {
  Name string
  Sex  T
}
func main() {
  // Person{
  //  Name string
  //  Sex  string
  // }
  var p = Person[string]{}
  p.Name = "linzhonyi"
  p.Sex = "男"
  fmt.Println(p)
}


五、泛型map:


//泛型map 在TMap创建的时候就要定义K,V的类型
type TMap[K int | string, V int | string] map[K]V
func main() {
  //make(map[string]string)
  m1 := make(TMap[string, string])
  m1["a"] = "a"
  //make(map[int]string)
  m2 := make(TMap[int, string])
  m2[1] = "a"
}


六、泛型切片:


type TSlice[T any] []T
func main() {
  s := make(TSlice[int], 6)
  s[4] = 123
  fmt.Println(s)
}
七、创建泛型约束
//创建泛型约束接口
type MyType interface {
  int | float64 | string | bool | int64
}
func test[T MyType](t T) {
  fmt.Println(t)
}
func main() {
  test(111)   //111
  test("222") //222
  test(3.33)  //3.33
  test(true)  //true
}


八、~的含义


当定义了自定义类型时正常的泛型接口是无法识别的,需要在泛型接口的类型前加~,表示涵盖底层类型.


//创建泛型约束接口
type MyType interface {
  ~int | ~float64
}
//自定义类型
type MyInt int
type MyFloat float64
func test[T MyType](t T) {
  fmt.Println(t)
}
func main() {
  mi := MyInt(111)
  test(mi) //111
  mf := MyFloat(1.11)
  test(mf) //1.11
}
目录
相关文章
|
8月前
|
Go
4.1 golang基础语法
4.1 golang基础语法
53 0
|
3月前
|
安全 Java Go
【Golang入门】简介与基本语法学习
Golang语言入门教程,介绍了Go语言的简介、基本语法、程序结构、变量和常量、控制结构、函数、并发编程、接口和类型、导入包、作用域以及错误处理等关键概念,为初学者提供了一个全面的学习起点。
62 0
|
5月前
|
Go 开发者 索引
Golang 中 for 循环的语法详解
【8月更文挑战第31天】
40 0
|
8月前
|
Go
Golang深入浅出之-Go语言基础语法:变量声明与赋值
【4月更文挑战第20天】本文介绍了Go语言中变量声明与赋值的基础知识,包括使用`var`关键字和简短声明`:=`的方式,以及多变量声明与赋值。强调了变量作用域、遮蔽、初始化与零值的重要性,并提醒读者注意类型推断时的一致性。了解这些概念有助于避免常见错误,提高编程技能和面试表现。
93 0
|
8月前
|
Go
【Golang】使用泛型对数组进行去重
【2月更文挑战第11天】使用泛型对数组进行去重
78 0
|
8月前
|
JSON 安全 Java
golang面试:golang基础语法(一)
golang面试:golang基础语法(一)
72 0
|
存储 安全 Java
|
存储 人工智能 Java
深入了解Golang:基本语法与核心特性解析
深入了解Golang:基本语法与核心特性解析
|
安全 IDE Linux
【Golang】一文学完 Golang 基本语法
【Golang】一文学完 Golang 基本语法
59 0
|
Go
Golang语法入门指南
Go是一种现代、高效、并发的编程语言,被设计用于构建可靠且高性能的软件。它具有简单的语法和强大的标准库,适用于各种类型的应用程序开发。本博客将引导您快速入门Golang的基本语法,并提供一些实用的技巧和最佳实践。
97 0