Go语言的泛型是在Go 1.18版本中引入的一个新特性,它允许开发者编写可以处理不同数据类型的代码,而无需为每种数据类型都编写重复的代码。以下是关于Go语言泛型的一些关键点:
func PrintSlice[T any](s []T) {...}
中,T
是一个类型参数,any
是它的约束。any
约束允许类型参数接受任何类型,包括内置类型、接口类型、结构体类型等。以下是一些使用Go语言泛型的示例:
接受一个类型参数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"}))
}
定义了一个可以存储任何类型元素的栈。
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())
}
定义了一个函数,该函数接受一个实现了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: mengbin92
cnblogs: 恋水无意