Ограничение типа через интерфейс с ~

Изменения в новых версиях / Go 1.18

// *** before: ***
// an interface could ask for methods only, not for operators like +,
// so generic arithmetic would have to go through reflect

// *** in version 1.18: ***
type Number interface {
    ~int | ~int64 | ~float64
}

func Sum[T Number](nums []T) T {
    var total T
    for _, n := range nums {
        total += n
    }
    return total
}

type Meters float64

fmt.Println(Sum([]Meters{1.5, 2.5})) // ~float64 also allows own types over
//float64