works:programmer:go:go-generics

Дженерики добавленные в Go с 1.18й версии

В 1.18й версии добавили отличную штуку, теперь не нужно типизировать десяток функций, а можно просто заюзать generic как это делается в C# или Яве.

common.go
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))
 
}
works/programmer/go/go-generics.txt · Last modified: 2022/12/28 23:26 by Chugreev Eugene