由于Go 1.18最近发布了泛型,因此我开始学习它们。我一般能理解这个概念,因为我以前有一些Java经验。但是我不理解一些实现细节。
例如:什么情况下更适合使用any
而不是interface{}
?以下是一个示例:
func printInterface(foo interface{}) {
fmt.Printf("%v\n", foo)
}
func printAny[T any](foo T) {
fmt.Printf("%v\n", foo)
}
func (suite *TestSuite) TestString() {
printInterface("foo")
printAny("foo")
}
两种实现都可以使用。但是,如果我尝试使用
any
版本打印 nil
,我会得到一个编译时错误:
https://go.dev/play/p/0gmU4rhhaOP 如果我尝试使用无法推断 T。
interface{}
版本打印 nil
,则不会出现此错误。那么什么是
any
的用例?与仅使用 interface{}
相比,它带来了哪些好处?我想提供一个具体的示例,在这个示例中,一个实现明显比另一个实现更合适和/或有一个可以评估的具体优势。
fmt.Printf
,而fmt.Printf
本身不是泛型的。 - mkopriva