接口的通用和非通用使用有什么区别?

The*_*ist 5 generics interface go

在新的类型参数设计草案中,您现在可以将接口约束应用于泛型函数:

func prettyPrint[T Stringer](s T) string {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,通过使用没有泛型的接口参数,这已经成为可能:

func prettyPrint(s Stringer) string {
    ...
}
Run Code Online (Sandbox Code Playgroud)

使用第一个和使用第二个有什么区别?

Eli*_*sky 7

我假设这个问题是指类型参数提案的最新草案,它可能会在 1.18 中以 Go 结束


第一个是参数多态性。编译器验证是否满足约束,然后生成采用静态已知类型的代码。重要的是,它不是盒装的

第二个是运行时多态性。它采用在编译时未知的类型(唯一已知的是它实现了接口)并在盒装接口指针上工作

撇开性能考虑不谈,在这种简单的情况下,您可以使用任何一种方法。泛型确实有助于解决当前工具无法正常工作的更复杂的情况。