package common import "fmt" //------------ Простой пример генериков func OK[T comparable](expr bool, ok T, bad T) T { if expr { return ok } return bad } //------------ Расширеный пример func SumIntOrFloat[K comparable, V int64 | float64](m map[K]V) V { var s V for _, v := range m { s += v } return s } //------------ С использованием интерфейса type Number interface { int | int32 | int64 | float32 | float64 } func SumNumbers[K comparable, V Number](m map[K]V) V { var ret V for _, v := range m { ret += v } return ret } //------------ Как всё это запускается func Test(x int, y int) { t := OK[string](x == y, "Ok", "Bad") print(t) var ints map[string]int64 = make(map[string]int64, 0) var floats map[string]float64 = make(map[string]float64, 0) ints["test"] = 1 ints["test2"] = 2 floats["test"] = 0.1 floats["test2"] = 0.2 fmt.Printf("Generic Sums: %v and %v\n", SumIntOrFloat[string, int64](ints), SumIntOrFloat[string, float64](floats)) fmt.Printf("Generic Sums: %v and %v\n", SumNumbers[string, int64](ints), SumNumbers[string, float64](floats)) }