func add[T constraints.Integer | contraints.Float](a, b T) T {
return a + b
}
// Define Function name(Primrose) and type parameter(T constraint)
func Primrose[T contraint](p T) {
...
}
func Print[T ant](a, b T) {
fmt.Println(a, b)
}
func main() {
// OK
Print(1, 2)
Print(3.14, 1.43)
Print("Hello", "World")
// Error !
Print(1, "Hello")
}
func Print[T1 any, T2 any](a T1, b T2) {
fmt.Println(a, b)
}
func PrintInterface(a, b interface{}) {
fmt.Println(a, b)
}
func main() {
// ... Two function will get same result.
}
func add[T Integer](a, b T) T {
return a + b
}
type Integer interface {
~ int8 | ~int16 | ~int32 | ~int64 | ~int
}
func add[T Integer](a, b T) T {
return a + b
}
type MyInt int
func main() {
// OK!
add(1, 2)
var a MyInt = 3
var b MyInt = 5
add(a, b)
}