接口的通用和非通用使用有什么区别?
在新的类型参数设计草案中,您现在可以将接口约束应用于泛型函数:
func prettyPrint[T Stringer](s T) string {
...
}
但是,通过使用没有泛型的接口参数,这已经成为可能:
func prettyPrint(s Stringer) string {
...
}
使用第一个和使用第二个有什么区别?
回答
我假设这个问题是指类型参数提案的最新草案,它可能会在 1.18 中以 Go 结束。
第一个是参数多态性。编译器验证是否满足约束,然后生成采用静态已知类型的代码。重要的是,它不是盒装的。
第二个是运行时多态性。它采用在编译时未知的类型(唯一已知的是它实现了接口)并在盒装接口指针上工作。
撇开性能考虑不谈,在这种简单的情况下,您可以使用任何一种方法。泛型确实有助于解决当前工具无法正常工作的更复杂的情况。