golang1.8之泛型

  1. 泛型函数的声明
    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))

}

posted @ 2022-04-24 22:32  甜甜太阳雨  阅读(1242)  评论(0编辑  收藏  举报