右边是一个泛型接口,其中类型参数T可以是任务类型
结构体也可以使用泛型
gotype LinedListV1[T any] struct {
head *nodeV1[T]
}
func (l *LinkedListV1[T]) Add (idx int, val T) {
//TODO implement me
panic("implement me")
}
func (l *LinkedListV1[T]) Append(val T){
//TODO implement me
panic("implement me")
}
func (l *LinkedListV1[T]) Delete(idx T){
//TODO implement me
panic("implement me ")
}
type NodeV1[T any] struct {
data T
}
func UseList(){
l := &LinkedListV1[int]{}
l.Add(index: 1, val:123)
l.Add(index: 1, val:"123") //这里会报错
}
方法也可以用泛型
gopackage generics
func Sum[T Number](vals []T) T{
var res T
for _,v :=range vals{
res = res + v // 若sum用的是Any,就不能相加,因为数据类型可能是非数字,所以该用Number来检查
}
return res
}
type Integer int
type Number interface {
int | unint
// 或者int的衍生类型 ~int | unint
}
func UseSum(){
// 必须使用衍生类型的int
res:=Sum[int]([]int{123, 123})
println(res)
resV1 := Sum[Integer]([]Integer{123,123})
println(res)
}
func Closable[T io.Closer](){
var t T
t.Close()
}
gofunc Max[T Number](vals []T) T{
t:=vals[0]
for i :=1; i< len(vals);i++ {
if t <vals[i]{
t=vals[i]
}
}
return t
}
func Min[T Number](vals []T) T{
t:=vals[0]
for i :=1; i< len(vals);i++ {
if t >vals[i]{
t=vals[i]
}
}
return t
}
gofunc Find[T any](vals []T, filter func(t T)bool) T{
for _,v :=range vals{
if filter(v) {
return v
}
}
var t T
return t
}
gofunc Insert[T any](ids int, vals []int) {
if idx <0 || idx >= len(vals) {
panic("idx 不合法")
}
//先扩容
vas = append(vals, val)
for i:=len(vals)-1; i>idx; i-- {
if i-1>=0{
vals[i]=vals[i-1]
}
}
vals[idx] = val
return vals
}
//调用使用
package main
import "fmt"
func main(){
fmt.Printf("%v \n", Insert[int](0, 12, []int{1,2}))
fmt.Printf("%v \n", Insert[int](2, 12, []int{1,2}))
fmt.Printf("%v \n", Insert[int](1, 12, []int{1,2}))
}
本文作者:Eric
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!