golang1.8之泛型
-
泛型函数的声明
func printlne[T any](s []T) {
for _, v := range s {
fmt.Println(v)
}
}
func main() {
printlne[int]([]int{45, 43, 2, 32, 32, 1, 21, 90})
printlne[float64]([]float64{1.1, 2.2})
printlne[string]([]string{"geng", "ze", "shi"})// 省略显示类型, 简单写法(泛型函数的简单使用)
printlne([]int{3, 4, 65, 78, 6})
}
2.泛型定义切片声明
type vector[T any] []T
func printslice[T any](s []T) {
for _, v := range s {
fmt.Println(v)
}
}
func main() {
v1 := vector[int]{23, 454, 54645, 65}
printslice(v1)
v2 := vector[string]{"geng", "ze", "shi"}
printslice(v2)
}
3.泛型定义map
type M[k string, v int] map[k]v
type MA[k string, v any] map[k]v
func main() {
m1 := M[string, int]{"geng": 23}
fmt.Println(m1)
m1["geng"] = 100
fmt.Println(m1)
m2 := MA[string, int]{"geng": 23433}
fmt.Println(m2)
}
4.泛型定义之通道
type C[T any] chan T
func main() {
c1 := make(C[int], 10)
c1 <- 2
c1 <- 1
c2 := make(C[string], 10)
c2 <- "geng"
c2 <- "ze"
fmt.Println(<-c1, <-c2)
}
5.泛型之定义限制传入类型
type NumStr interface {
Num | Str
}
type Num interface {
~int | ~int32
}
type Str interface {
string
}
func add[T NumStr](a, b T) T {
return a + b
}
func main() {
fmt.Println(add(2, 4))
fmt.Println(add("hello", "world"))
}
6.泛型之约束
type Price int
type ShowPrice interface {
String() string
}
func (show Price) String() string {
return strconv.Itoa(int(show))
}
func ShowPriceList[T ShowPrice](s []T) (ret []string) {
for _, v := range s {
ret = append(ret, v.String())
}
return
}
func main() {
fmt.Println(ShowPriceList([]Price{1, 2}))
}
7.使用泛型判断两个值是否相等
func FindIndex[T comparable](a []T, v T) int {
for i, e := range a {
if e == v {
return i
}
}
return -1
}
func main() {
fmt.Println(FindIndex([]int{3223, 32, 3423, 23}, 23))
}