golang泛型学习笔记

1.泛型函数

func FuncName[T  C](ele ...T)(sum T) {}

T 泛型类型

C 类型集合

例如:

package main

import "fmt"

// 类型集合,~表示的是匹配该类型以及该类型衍生出来的任何类型
func ComSum[T int | ~float64](eles ...T) (sum T) {
	for _, v := range eles {
		sum += v
	}
	return sum
}

// any关键字泛型匹配
func Print[T any](v T) {
	fmt.Println(v)
}

func main() {
	fmt.Println(ComSum(1, 2, 3))
	fmt.Println(ComSum(1.1, 2.2, 3.3))
	Print[int](1)
	Print[string]("name")
}


输出:
[root@master01 goGeneris]# go run generis_0.go 
6
6.6
1
name

泛型不支持直接进行运算:

package main

import (
	"fmt"
)

// 不支持泛型类型直接进行运算
func Add[T any](a, b T) T {
	return a + b
}

func main() {
	Add(1, 2)
}

运行报错:
./generis_0.go:22:9: invalid operation: operator + not defined on a (variable of type T constrained by any)

2.泛型接口类型集

// 接口类型
type ST interface {
	~int | ~int64 | ~string
}

// 泛型函数可以简化类型集
func AllType[T ST](v T) {
	fmt.Println(v)
}

例如:

package main

import (
	"fmt"
)

// 接口类型
type ST interface {
	~int | ~int64 | ~string
}

// 泛型函数可以简化类型集
func AllType[T ST](v T) {
	fmt.Println(v)
}

func main() {
	AllType(1)
	AllType(1111)
	AllType("CCCCCCC")
}

3.接口类型结机构不支持

// 不持不定参数结构
type SST[Ts ...comparable] struct{

}

4.多类型跟多参数函数

package main

import (
	"fmt"
	"strconv"
)

// 多模板多参数函数
func KLn[T, R any](s []T, f func(T) R) []R {
	result := make([]R, len(s))

	for i, v := range s {
		result[i] = f(v)
	}
	return result
}

func main() {
	fc := func(s string) int {
		v, _ := strconv.Atoi(s)
		return v
	}
	ret := KLn([]string{"1", "2", "3"}, fc)
	fmt.Println(ret)

	// 指定类型
	ret = KLn[string, int]([]string{"4", "5", "6"}, fc)
	fmt.Println(ret)

}

5.泛型方法

package main

import "fmt"

// 模板结构类型
type XT[T any] struct {
	u T
}

// 不支持泛型函数
// func (t XT) Kan(v any) {
// }

// 不支持,方法必须有类型参数才行
// func (t T) Kdn(v any) {}

// *** 泛型类型定义泛型方法
func (t XT[T]) Ksn(v any) {

}

func main() {
	sxt := XT[string]{
		u: "hello",
	}
	fmt.Println(sxt.u)

	ixt := XT[int]{
		u: 111,
	}
	fmt.Println(ixt.u)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值