go中的仿制药在版本1.18中引入。
什么是仿制药?
仿制药是一种机制,我们可以通过函数中的任何类型的值传递。
GO版本1.18之前有什么问题?
package main
import "fmt"
func main() {
stringObject := "Hello"
floatObject := 3.14
intObject := 7
assertType(stringObject)
assertType(intObject)
assertType(floatObject)
}
func assertType(object interface{}) {
switch object.(type) {
case string:
fmt.Println("Received Type:", object.(string))
case int:
fmt.Println("Received Type:", object.(int))
default:
fmt.Println("Unknown Type")
}
}
因此,如果我们使用错误的数据类型推断,每次我们需要推断该类型时,它将导致恐慌。让我们看看另一个简单的例子。
package main
import "fmt"
func main() {
stringObject := "Hello"
printValue(stringObject)
}
func printValue(object interface{}) {
fmt.Println(object.(int))
}
在这里,我们正在尝试将字符串推断为int,以便引起恐慌。因此,如果我们不使用正确的类型,它将在我们的程序中引起恐慌。
3。 Genrics代码示例?
a。任何
让我们看看我们的第一个例子。我们将在函数中传递任何值,无论是数组,int,string。
package main
import (
"fmt"
)
func assertType(T any) {
fmt.Println(T)
}
func assertTypeArray[T any](arrayObject []T) []T {
for i := range arrayObject {
fmt.Println(i)
}
return arrayObject
}
func main() {
assertType("Hello")
assertType(12.32)
array := []int{1, 2, 3}
arrayObject := assertTypeArray(array)
fmt.Println(arrayObject)
}
b。预定义约束。
我们可以在Integer,float,然后嵌入数字接口中的界面中定义数据类型。使用预定义的约束我们可以限制输入。
package main
import (
"fmt"
)
type Integer interface {
~int | ~int8 | ~int16 | ~int32 | ~int64
}
type Float interface {
~float32 | ~float64
}
type Number interface {
Integer | Float
}
func Min[T Number](x, y T) T {
if x < y {
return x
}
return y
}
type IntType int64
func main() {
x, y := 1, 3
a, b := 1.1, 4.5
k, v := IntType(-12344), IntType(12)
fmt.Println(Min(x, y))
fmt.Println(Min(a, b))
fmt.Println(Min(k, v))
}