Golang的仿制药
#教程 #go #generics

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))
}