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}))
}