package main
 
import (
	"fmt"
)
 
type Integer interface {
	~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~float32 | ~float64
}
 
func multiplication[T Integer](i T) T {
	return i * 2
}
 
func main() {
	fmt.Print(multiplication(22.3))
}
package main
 
import (
	"fmt"
	"strconv"
)
 
type Printable interface {
	fmt.Stringer
	~int | ~float64
}
 
type PrintInt int
 
func (pi PrintInt) String() string {
	return strconv.Itoa(int(pi))
}
 
type PrintFloat float64
 
func (pf PrintFloat) String() string {
	return fmt.Sprintf("%f", pf)
}
 
func PrintIt[T Printable](t T) {
	fmt.Println(t)
}
 
func main() {
	var i PrintInt = 20
	PrintIt(i)
 
	var f PrintFloat = 10.23
	PrintIt(f)
}