1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| package main
import "fmt"
type Ordered interface { ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~float32 | ~float64 | ~string }
func Unique[T comparable](slice []T) []T { seen := make(map[T]struct{}) result := make([]T, 0) for _, v := range slice { if _, ok := seen[v]; !ok { seen[v] = struct{}{} result = append(result, v) } } return result }
func Chunk[T any](slice []T, size int) [][]T { if size <= 0 { return nil } var chunks [][]T for i := 0; i < len(slice); i += size { end := i + size if end > len(slice) { end = len(slice) } chunks = append(chunks, slice[i:end]) } return chunks }
type Pair[A, B any] struct { First A Second B }
func Zip[A, B any](a []A, b []B) []Pair[A, B] { minLen := len(a) if len(b) < minLen { minLen = len(b) } result := make([]Pair[A, B], minLen) for i := 0; i < minLen; i++ { result[i] = Pair[A, B]{First: a[i], Second: b[i]} } return result }
func Min[T Ordered](slice []T) (T, bool) { if len(slice) == 0 { var zero T return zero, false } min := slice[0] for _, v := range slice[1:] { if v < min { min = v } } return min, true }
func main() { nums := []int{1, 2, 3, 2, 1, 4, 3, 5} fmt.Println("Unique:", Unique(nums))
data := []int{1, 2, 3, 4, 5, 6, 7} fmt.Println("Chunks:", Chunk(data, 3))
names := []string{"Alice", "Bob", "Charlie"} ages := []int{30, 25, 35} pairs := Zip(names, ages) for _, p := range pairs { fmt.Printf("%s: %d\n", p.First, p.Second) }
min, _ := Min([]int{5, 3, 8, 1, 9}) fmt.Println("Min:", min) }
|