Golang泛型的简单使用

发布时间 2023-10-20 11:18:53作者: 朝阳1
package main

import "fmt"

// MyInt ~表示不仅支持int8, 还支持int8的衍生类型int8A和int8B
type MyInt interface {
	int | ~int8 | int16 | int32 | int64
}

func getMaxNum[T MyInt](a, b T) T {
	if a > b {
		return a
	}
	return b
}

// 结构体
type AgeT interface {
	int8 | int16
}
type NameE interface {
	string
}
type User[T AgeT, E NameE] struct {
	age  T
	name E
}

// 获取age
func (u *User[T, E]) GetAge() T {
	return u.age
}

// 获取name
func (u *User[T, E]) GetName() E {
	return u.name
}

// Get 泛型和switch配合使用时,无法通过编译,只能先将泛型赋值给interface才可以和switch配合使用
func Get[T any]() T {
	var t T

	var ti interface{} = &t
	switch v := ti.(type) {
	case *int:
		*v = 18
	}

	return t
}

// 进行类型约束时就可以使用当前类
// 类型约束
type Number interface {
	int64 | float64
}

func SumIntsNumbers[K comparable, V Number](m map[K]V) V {
	var s V
	for _, v := range m {
		s += v
	}
	return s
}

func main() {
	fmt.Println(getMaxNum(1, 2))

	var u User[int8, string]

	// 赋值
	u.age = 18
	u.name = "zhangsan"

	// 调用方法
	age := u.GetAge()
	name := u.GetName()

	// 输出结果 18 zhangsan
	fmt.Println(age, name)
}