go1.8-泛型

基本思想:
Parametric Polymorphism(形式)参数多态

基本语法

package main

import "fmt"

func printSlice[T any](s []T){
	for _,v:=range s{
		fmt.Printf("%v",v)
	}
	fmt.Print("\n")
}
func main() {
	printSlice[int]([]int{66,77,88,99,100})
	printSlice[float64]([]float64{1.1,2.2,3.3,4.4,5.5})
	printSlice[string]([]string{"红烧肉","清蒸鱼","大闸蟹","九转大肠","重烧海参"})
	printSlice([]int64{55,44,33,22,11})
}
  • go run -gcflags=-G=3 path/main.go
  • [T any]
    参数的类型,该函数支持任何T类型
    在调用这个泛型函数的时候,可以显示指定类型参数,也可省略

泛型切片声明切片类型

带有类型参数的类型被叫做泛型类型。下面定义一个底层类型为切片类型的新类型vector.它可以存储任何类型的切片。要使用泛型类型,要先对其进行实例化,就是给类型参数指定一个实参

package main

import "fmt"

type vector[T any] []T

func printSlice[T any](s []T){
	for _,v:=range s{
		fmt.Printf("%v",v)
	}
	fmt.Print("\n")
}

func main() {
	v:=vector[int]{58,188}
	printSlice(v)
	vv:=vector[string]{"红烧肉","九转大肠"}
	printSlice(vv)
}

泛型函数

package main

import "fmt"

type Addable interface{
	type int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,
	uintptr,float32,float64,complex64,complex128,string
}

func add[T Addable](a,b T) T {return a+b}

func main() {
	fmt.Println(add(3,4))
	fmt.Println(add("go","lang"))
}

新增了类型列表表达式,它是对类型参数进行约束
如果编译器通过得到的类型在Addable这个接口定义列表中,那么就可以允许这个类型参数实例化,否则就会报错。

interface约束泛

package main

import (
	"strconv"
	"fmt"
)

type Price int

type ShowPrice interface {
	String() string
}

func (i Price) String() string {
	return strconv.Itoa(int(i))
}

func showPriceList[T ShowPrice](s []T)(ret []string){
	for _,v:=range s{
		ret=append(ret, v.String())
	}
	return ret
}

func main() {
	fmt.Printf("%T",showPriceList([]Price{22,33,55,88,99}))
}
posted @ 2021-12-07 13:56  wangzhilei  阅读(107)  评论(0编辑  收藏  举报