You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
4.9 KiB
273 lines
4.9 KiB
package goSyntax
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
func GenericDef() {
|
|
// 一:泛型类型的定义
|
|
// 使用类型参数来定义类型
|
|
type mySlice[P int | string] []P
|
|
// 泛型类型 mySlice[P]
|
|
|
|
type myMap[K int | string, V float64 | float32] map[K]V
|
|
|
|
type myList[T int | float64] struct {
|
|
data []T
|
|
l int
|
|
max, min, avg T
|
|
}
|
|
|
|
// 二:声明泛型类型的变量
|
|
// 泛型类型的的实例化,得到了具体的 []int, []string
|
|
_ = mySlice[int]{1, 2, 3, 4}
|
|
_ = mySlice[string]{"one", "two", "three", "four"}
|
|
// 注意:泛型不是那种类型都可以的意思,不是弱类型的概念
|
|
//_ = mySlice[int|string]{1, 2, "three", "four"}
|
|
|
|
_ = myMap[string, float32]{ // map[string]float32
|
|
"go": 99.5,
|
|
}
|
|
|
|
_ = myList[int]{
|
|
data: []int{1, 2, 3},
|
|
max: 3,
|
|
}
|
|
|
|
// 三,测试数据的类型
|
|
fmt.Printf("%T\n", mySlice[int]{1, 2, 3, 4})
|
|
fmt.Printf("%T\n", mySlice[string]{"one", "two", "three", "four"})
|
|
fmt.Printf("%T\n", myMap[string, float32]{ // map[string]float32
|
|
"go": 99.5,
|
|
})
|
|
fmt.Printf("%T\n", myList[int]{
|
|
data: []int{1, 2, 3},
|
|
max: 3,
|
|
})
|
|
}
|
|
|
|
func GenericExt() {
|
|
// 一:类型约束为基础类型
|
|
// ~
|
|
type intSlice[P ~int] []P
|
|
_ = intSlice[int]{}
|
|
// 以int为基础类型的自定义类型
|
|
type myInt int
|
|
type yourInt myInt
|
|
_ = intSlice[myInt]{}
|
|
_ = intSlice[yourInt]{}
|
|
|
|
// Cannot use int32 as the type interface{ ~int }
|
|
//_ = intSlice[int32]{}
|
|
|
|
// 二,基于泛型类型,继续定义泛型类型
|
|
type mySlice[T int | string | float32 | float64] []T
|
|
// mySlice[T]
|
|
type floatSlice[T float32 | float64] mySlice[T]
|
|
//
|
|
type myStruct[T float32 | float64] struct {
|
|
FieldA mySlice[T]
|
|
}
|
|
|
|
// 三:错误语法注意
|
|
// 类型即可是int也可是string
|
|
//type myT[T int | string] T
|
|
//type myT interface{ int | string }
|
|
|
|
type T1[P *int,] []P
|
|
type T2[P interface{ *int }] []P
|
|
}
|
|
|
|
// 一:定义泛型类型
|
|
type myList[T int | float64 | int32 | float32] struct {
|
|
data []T
|
|
max, min T
|
|
m sync.Mutex
|
|
}
|
|
|
|
// 二:定义泛型类型的方法集
|
|
// 1, 添加元素,更新最大值最小值
|
|
// 泛型接收器, 泛型类型参数类型
|
|
func (l *myList[T]) Add(ele T) *myList[T] {
|
|
// 加锁并发安全考虑
|
|
l.m.Lock()
|
|
defer l.m.Unlock()
|
|
|
|
// 更新 data
|
|
l.data = append(l.data, ele)
|
|
|
|
// 统计 min max
|
|
if len(l.data) == 1 {
|
|
l.max = ele
|
|
l.min = ele
|
|
}
|
|
|
|
if ele > l.max {
|
|
l.max = ele
|
|
}
|
|
|
|
if ele < l.min {
|
|
l.min = ele
|
|
}
|
|
|
|
return l
|
|
}
|
|
|
|
// 2, 获取元素
|
|
func (l myList[T]) All() []T {
|
|
return l.data
|
|
}
|
|
|
|
func (l myList[T]) Max() T {
|
|
return l.max
|
|
}
|
|
|
|
func (l myList[T]) Min() T {
|
|
return l.min
|
|
}
|
|
|
|
func GenericReceiver() {
|
|
//l := myList[int]{}
|
|
l := myList[float64]{}
|
|
// 添加
|
|
l.Add(1.1).Add(3.3).Add(10.01)
|
|
// 获取元素
|
|
fmt.Println(l.All())
|
|
fmt.Println(l.Max(), l.Min())
|
|
}
|
|
|
|
type Queue[T int | string] struct {
|
|
data []T
|
|
}
|
|
|
|
func (q *Queue[T]) Put(v ...T) *Queue[T] {
|
|
q.data = append(q.data, v...)
|
|
return q
|
|
}
|
|
|
|
func (q *Queue[T]) Pop() (T, bool) {
|
|
var v T
|
|
if len(q.data) == 0 {
|
|
return v, true
|
|
}
|
|
|
|
v = q.data[0]
|
|
q.data = q.data[1:]
|
|
return v, len(q.data) == 0
|
|
}
|
|
|
|
func (q Queue[T]) Size() int {
|
|
return len(q.data)
|
|
}
|
|
|
|
// 泛型函数求和
|
|
func Sum[T int | string](ele ...T) T {
|
|
var s T
|
|
for _, v := range ele {
|
|
s += v
|
|
}
|
|
func(n T) {
|
|
}(s)
|
|
return s
|
|
}
|
|
|
|
func GenericFunc() {
|
|
// 显式指定类型,调用函数
|
|
fmt.Println(Sum[int](1, 2, 3))
|
|
fmt.Println(Sum[string]("ma", "shi", "bing"))
|
|
}
|
|
|
|
func GenericInference() {
|
|
// 显式指定类型,调用函数
|
|
fmt.Println(Sum(1, 2, 3))
|
|
fmt.Println(Sum("ma", "shi", "bing"))
|
|
}
|
|
|
|
func GuessType[T int | string](ele ...T) T {
|
|
var s T
|
|
for _, v := range ele {
|
|
s += v
|
|
}
|
|
func(n T) {
|
|
}(s)
|
|
return s
|
|
}
|
|
|
|
func TypeInference() {
|
|
//
|
|
fmt.Println(GuessType[int](1, 2, 3))
|
|
fmt.Println(GuessType[string]("Ma", "Shi", "Bing"))
|
|
|
|
// 类型推断
|
|
fmt.Println(GuessType(1, 2, 3))
|
|
fmt.Println(GuessType("Ma", "Shi", "Bing"))
|
|
|
|
// 全部指定
|
|
GuessType2[int, string](42, "Ma")
|
|
// 指定前面部分
|
|
GuessType2[int](42, "Ma")
|
|
// 指定后边部分
|
|
GuessType2(42, "Ma")
|
|
|
|
// 合理
|
|
GuessType3(42, []int{})
|
|
// 不合理
|
|
//GuessType3(42, []string{})
|
|
}
|
|
|
|
func GuessType2[K int | string, V float64 | string](p1 K, p2 V) {
|
|
}
|
|
func GuessType3[K int | string, V []K](p1 K, p2 V) {
|
|
}
|
|
|
|
// 泛型接口 generate interface
|
|
type Data[T int | string] interface {
|
|
Process(T) (T, error)
|
|
Save() error
|
|
}
|
|
|
|
func GenerateInterface() {
|
|
// JsonData 实现了 Data[string]
|
|
DataOperate(JsonData{})
|
|
// NumberData 没有实现 Data[string]
|
|
//DataOperate(NumberData{})
|
|
|
|
DataOperateInt(NumberData{})
|
|
}
|
|
|
|
func DataOperate(p Data[string]) {
|
|
|
|
}
|
|
|
|
func DataOperateInt(p Data[int]) {
|
|
|
|
}
|
|
|
|
// Data[string] 相当于
|
|
//type Data interface {
|
|
// Process(string) (string, error)
|
|
// Save() error
|
|
//}
|
|
|
|
// 实现接口的类型
|
|
type JsonData struct{}
|
|
|
|
func (JsonData) Process(string) (string, error) {
|
|
return "", nil
|
|
}
|
|
|
|
func (JsonData) Save() error {
|
|
return nil
|
|
}
|
|
|
|
type NumberData struct{}
|
|
|
|
func (NumberData) Process(int) (int, error) {
|
|
return 0, nil
|
|
}
|
|
|
|
func (NumberData) Save() error {
|
|
return nil
|
|
}
|