VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > go语言 >
  • Go泛型简介

Go语言的泛型是在Go 1.18版本中引入的一个新特性,它允许开发者编写可以处理不同数据类型的代码,而无需为每种数据类型都编写重复的代码。以下是关于Go语言泛型的一些关键点:

  1. 泛型是通过在函数或类型定义中使用类型参数来实现的。类型参数可以被看作是一个特殊的类型,它可以在函数或类型定义中的任何位置使用。
  2. 在函数或类型定义中,类型参数的列表是在名称后面的方括号中给出的。例如,在函数定义 func PrintSlice[T any](s []T) {...} 中,T 是一个类型参数,any 是它的约束。
  3. 约束定义了类型参数可以接受的类型范围。例如,any 约束允许类型参数接受任何类型,包括内置类型、接口类型、结构体类型等。
  4. 你可以定义自己的约束,通过定义一个接口类型,然后在类型参数列表中使用它。类型参数必须满足这个接口的所有方法。
  5. Go语言的泛型是在编译时实现的,这意味着所有的类型检查都是在编译时进行的,而不是在运行时。
  6. Go语言的泛型提供了代码复用和类型安全的优点,但是它也可能导致编译时间增加和生成的二进制文件变大。

以下是一些使用Go语言泛型的示例:

1. 泛型函数

接受一个类型参数T,并返回T类型的切片中的第一个元素。


 
package main
 
 
 
import "fmt"
 
 
 
func First[T any](s []T) (T, bool) {
 
if len(s) == 0 {
 
var zero T
 
return zero, false
 
}
 
return s[0], true
 
}
 
 
 
func main() {
 
fmt.Println(First[int]([]int{1, 2, 3}))
 
fmt.Println(First[string]([]string{"Hello", "World"}))
 
}

2. 泛型类型

定义了一个可以存储任何类型元素的栈。


 
package main
 
 
 
import "fmt"
 
 
 
type Stack[T any] []T
 
 
 
func (s *Stack[T]) Push(v T) {
 
*s = append(*s, v)
 
}
 
 
 
func (s *Stack[T]) Pop() (T, bool) {
 
if len(*s) == 0 {
 
var zero T
 
return zero, false
 
}
 
index := len(*s) - 1
 
element := (*s)[index]
 
*s = (*s)[:index]
 
return element, true
 
}
 
 
 
func main() {
 
s := Stack[int]{}
 
s.Push(1)
 
s.Push(2)
 
s.Push(3)
 
fmt.Println(s.Pop())
 
fmt.Println(s.Pop())
 
fmt.Println(s.Pop())
 
}

3. 自定义约束

定义了一个函数,该函数接受一个实现了Stringer接口的类型参数。


 
package main
 
 
 
import (
 
"fmt"
 
"strconv"
 
)
 
 
 
type Stringer interface {
 
String() string
 
}
 
 
 
func Print[T Stringer](s T) {
 
fmt.Println(s.String())
 
}
 
 
 
type MyInt int
 
 
 
func (m MyInt) String() string {
 
return strconv.Itoa(int(m))
 
}
 
 
 
func main() {
 
Print[MyInt](MyInt(10))
 
}

在这个例子中,Print函数接受一个实现了Stringer接口的类型参数。MyInt类型实现了Stringer接口,所以我们可以将MyInt类型的值传递给Print函数。


 

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
author: mengbin
blog: mengbin
github: https://mengbin92.github.io/
cnblogs: 恋水无意

出处:
https://www.cnblogs.com/lianshuiwuyi/p/17617023.html


相关教程