package main
import (
"fmt"
"time"
)
type Animal interface { Get() int }
type Dog struct{ Value int }
func (d Dog) Get() int { return d.Value }
type Signed interface { ~int | ~int8 | ~int16 | ~int32 | ~int64 }
type NumericBox[T Signed] struct { Value T }
// Функция, принимающая конкретный тип.
func printInt(i int) {
fmt.Println(i)
}
// функция, принимающая интерфейс Animal.
func printInterface(animal Animal) {
fmt.Println(animal.Get())
}
// Функция, принимающая экземпляр NumericBox с любым поддерживаемым числовым типом.
func printGinerics[T Signed](box NumericBox[T]) {
fmt.Println(box.Value)
}
func main() {
// Замер производительности при использовании конкретного типа.
startConcrete := time.Now()
for i := 0; i < 1000000; i++ {
printInt(i)
}
resultConcrete := time.Since(startConcrete)
// Замер производительности при использовании интерфейса.
startInter := time.Now()
for i := 0; i < 1000000; i++ {
printInterface(Dog{Value: i})
}
resultInter := time.Since(startInter)
// Замер производительности при использовании дженерика.
startGeneric := time.Now()
for i := 0; i < 1000000; i++ {
printGinerics(NumericBox[int]{Value: i})
}
resultGeneric := time.Since(startGeneric)
fmt.Printf("Using concrete type: %v\n", resultConcrete) // Using concrete type: 869.528353ms
fmt.Printf("Using interface: %v\n", resultInter) // Using interface: 877.926898ms
fmt.Printf("Using generic: %v\n", resultGeneric) // Using generic: 841.916956ms
}