支持int、float、string类型打印的print函数

package main

import "fmt"

func print[T any] (arr []T) {
    for _, v := range arr {
        fmt.Print(v)
        fmt.Print(" ")
    }
    fmt.Println("")
}

func main() {
    strs := []string{"Hello", "World", "Generics"}
    decs := []float64{3.14, 1.14, 1.618, 2.718}
    nums := []int{2, 4, 6, 8}

    print(strs)
    print(decs)
    print(nums)
}

go1.18上运行

 查找算法

func find[T comparable] (arr []T, elem T) int {
    for i, v := range arr {
        if v == elem {
            return i
        }
    }
    return -1
}

数据结构

Stack栈

package main

import "fmt"

type stack[T any] []T

func (s *stack[T]) push(elem T) {
    *s = append(*s, elem)
}

func (s *stack[T]) pop() {
    if len(*s) > 0 {
        *s = (*s)[:len(*s)-1]
    }
}

func (s *stack[T]) top() *T {
    if len(*s) > 0 {
        return &(*s)[len(*s)-1]
    }
    return nil
}

func (s *stack[T]) len() int {
    return len(*s)
}

func (s *stack[T]) print() {
    for _, elem := range *s {
        fmt.Print(elem)
        fmt.Print(" ")
    }
    fmt.Println("")
}

func main() {
    ss := stack[string]{}
    ss.push("Hello")
    ss.push("World")
    ss.push("Zhi")
    ss.push("Chen")
    ss.print()
    fmt.Printf("stack top is - %v\n", *(ss.top()))
    ss.pop()
    ss.pop()
    ss.print()

    ns := stack[int] {}
    ns.push(10)
    ns.push(20)
    ns.print()
    ns.pop()
    ns.print()
    *ns.top() += 1
    ns.print()
    ns.pop()
    fmt.Printf("stack top is - %v\n", ns.top())
}

 LinkList双向链表

add()
push()
del()compareable
print()
package main

import "fmt"

type node[T comparable] struct {
    data T
    prev *node[T]
    next *node[T]
}

type list[T comparable] struct {
    head, tail *node[T]
    len int
}

func (l *list[T]) isEmpty() bool {
    return l.head == nil && l.tail == nil
}

func (l *list[T]) add(data T) {
    n := &node[T] {
        data: data,
        prev: nil,
        next: l.head,
    }
    if l.isEmpty() {
        l.head = n 
        l.tail = n
    }
    l.head.prev = n 
    l.head = n
}

func (l *list[T]) push(data T) {
    n := &node[T]{
        data: data,
        prev: l.tail,
        next: nil,
    }
    if l.isEmpty() {
        l.head = n 
        l.tail = n 
    }
    l.tail.next = n 
    l.tail = n 
}

func (l *list[T]) del(data T) {
    for p := l.head; p != nil; p = p.next {
        if data == p.data {
            if p == l.head {
                l.head = p.next
            }
            if p == l.tail {
                l.tail = p.prev
            }
            if p.prev != nil {
                p.prev.next = p.next
            }
            if p.next != nil {
                p.next.prev = p.prev
            }
            return
        }
    }
}

func (l *list[T]) print() {
    if l.isEmpty() {
        fmt.Println("the link list is empty")
        return
    }
    for p:=l.head; p != nil; p=p.next {
        fmt.Printf("[%v] -> ", p.data)
    }
    fmt.Println("nil")
}

func main() {
    var l = list[int]{}
    l.add(1)
    l.add(2)
    l.push(3)
    l.push(4)
    l.add(5)
    l.print()
    
    l.del(5)
    l.del(1)
    l.del(4)
    l.print()
}

 函数式泛型

泛型Map

package main

import (
    "fmt"
    "strings"
)

func print[T any] (arr []T) {
    for _, v := range arr {
        fmt.Print(v)
        fmt.Print(" ")
    }
    fmt.Println("")
}

func gMap[T1 any, T2 any] (arr []T1, f func(T1) T2) []T2 {
    result := make([]T2, len(arr))
    for i, elem := range arr {
        result[i] = f(elem)
    }
    return result
}

func main() {
    nums := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    squares := gMap(nums, func(elem int) int {
        return elem * elem
    })
    print(squares)

    strs := []string{"Zhi", "Chen", "MegaEase"}
    upstrs := gMap(strs, func(s string) string {
        return strings.ToUpper(s)
    })
    print(upstrs)

    dict := []string{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}
    strs = gMap(nums, func(elem int) string {
        return dict[elem]
    })
    print(strs)
}

 

 泛型Reduce

package main

import (
    "fmt"
)

func gReduce[T1 any, T2 any] (arr []T1, init T2, f func(T2, T1) T2) T2 {
    result := init
    for _, elem := range arr {
        result = f(result, elem)
    }
    return result
}

func main() {
    nums := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    sum := gReduce(nums, 0, func(result, elem int) int {
        return result + elem
    })
    fmt.Printf("Sum = %d\n", sum)
}

 泛型filter

用来做过滤的,把数据中一些符合条件(filter in)或是不符合条件(filter out)的数据过滤出来

bool
package main

import (
    "fmt"
)

func print[T any] (arr []T) {
    for _, v := range arr {
        fmt.Print(v)
        fmt.Print(" ")
    }
    fmt.Println("")
}

func gFilter[T any] (arr []T, in bool, f func(T) bool) []T {
    result := []T{}
    for _, elem := range arr {
        choose := f(elem)
        if (in && choose) || (!in && !choose) {
            result = append(result, elem)
        }
    }
    return result
}

func gFilterIn[T any] (arr []T, f func(T) bool) []T {
    return gFilter(arr, true, f)
}

func gFilterOut[T any] (arr []T, f func(T) bool) []T {
    return gFilter(arr, false, f)
}

func main() {
    nums := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    odds := gFilterIn(nums, func(elem int) bool {   // 把数组中所有的奇数过滤出来
        return elem % 2 == 1
    })
    print(odds)
}