小编典典

Go中的泛型函数

go

我正在学习中Go,文档和交互式课程说,空interface可以容纳任何类型,因为它不需要其他实现的方法。

举个例子:

func describe(i interface{}) {
    fmt.Printf("Type: %T | Value: %v\n", i, i)
}

…将打印出来…

"Type: int | Value: 5" // for i := 5
"Type: string | Value: test" // for i := "test"
... etc

因此,我想我的问题是这是Go's实现通用函数的方法,还是还有另一种更合适的方法来实现它们。


阅读 310

收藏
2020-07-02

共1个答案

小编典典

Go范式通常是通过在非空接口中实现行为来避免这种情况。例如,假设您要打印特定于类型的格式的内容:

func Print(i interface{}) {
    switch o := i.(type) {
        case int64:
            fmt.Printf("%5d\n", o)
        case float64:
            fmt.Printf("%7.3f\n", o)
        case string:
            fmt.Printf("%s\n", o)
        default: // covers structs and such
            fmt.Printf("%+v\n", o)
    }
}

或者,您可以为知道如何进行字符串自身设置的接口定义一个接口(该接口在库中以形式存在fmt.Stringer),并使用该接口:

type Stringer interface {
    String() string
}

func Print(o Stringer) {
    fmt.Println(o.String())
}

type Foo struct {
    a, b int
}

func (f Foo) String() string {
    // Let's use a custom output format that differs from %+v
    return fmt.Sprintf("%d(%d)", f.a, f.b) 
}

type Bar struct {
    t bool
}

func (b Bar) String() string {
    if b.t {
        return "TRUE! =D"
    }
    return "false =("
}

https://play.golang.org/p/Ez6Hez6cAv

这使您具有类似泛型的功能,但仍保留类型安全性,并且行为本身 由type 定义,而不是 泛型函数定义。

Go鼓励您以这种方式根据类型的行为,可以 做什么 而不是 包含的内容 来思考类型。

2020-07-02