2 回答

TA貢獻1842條經(jīng)驗 獲得超21個贊
除了any和是類型別名——因此,在用法上是等價的——在as type parameter和as regular function argumentinterface{}之間存在實際差異,如您的示例所示。anyany
不同之處在于,在printAny[T any](foo T)類型中foo不是any/ interface{},而是T. 在T實例化之后是一個具體類型,它本身可能是也可能不是接口。然后,您只能將參數(shù)傳遞給printAny可以分配給該具體類型的實例化。
這對您的代碼的影響在多個參數(shù)中最為明顯。如果我們稍微更改函數(shù)簽名:
func printInterface(foo, bar any) {
fmt.Println(foo, bar)
}
func printAny[T any](foo, bar T) {
fmt.Println(foo, bar)
}
實例化后:
該函數(shù)接受相同類型的printAny任意兩個參數(shù)——以用于實例化的參數(shù)為準T
printInterface,這相當于printInterface(foo, bar interface{})仍然可以接受兩個不同類型的參數(shù),因為它們都可以單獨分配給any/ interface{}。
printInterface(12.5, 0.1) // ok
printInterface(12.5, "blah") // ok, int and string individually assignable to any
printAny(10, 20) // ok, T inferred to int, 20 assignable to int
printAny(10, "k") // compiler error, T inferred to int, "k" not assignable to int
printAny[any](10, "k") // ok, T explicitly instantiated to any, int and string assignable to any
printAny(nil, nil) // compiler error, no way to infer T
printAny[any](nil, nil) // ok, T explicitly instantiated to any, nil assignable to any
游樂場:https ://go.dev/play/p/pDjP986cj96
注意:沒有顯式類型參數(shù)就不能調(diào)用泛型版本,nil因為nilalone 不攜帶類型信息,所以編譯器無法推斷T。但是nil通??梢苑峙浣o接口類型的變量。

TA貢獻1827條經(jīng)驗 獲得超4個贊
any
是的別名。規(guī)范:接口類型:interface{}
為方便起見,預先聲明的類型
any
是空接口的別名。
由于它是別名,因此使用哪一個都無關(guān)緊要。他們是一樣的。它們可以互換。您可以將一個替換為另一個,代碼的含義相同。
any
更短更清晰,但僅適用于 Go 1.18。
由于它們是可互換的,這也適用:
func printInterface(foo any) {
fmt.Printf("%v\n", foo)
}
printAny()不起作用的原因是因為它是一個帶有類型參數(shù)的通用函數(shù)。要使用它,它必須被實例化(它的類型參數(shù)必須被分配一個已知的類型)。嘗試調(diào)用它時nil不攜帶任何類型信息,因此無法進行實例化,類型推斷也不會起作用。
如果你用一個帶有類型信息的值調(diào)用它,它就會工作,或者如果你明確指定類型參數(shù)(在Go Playgroundnil上試試):
printAny((*int)(nil))
printAny[*int](nil)
// Or
var r io.Reader
printAny(r)
如前所述,any可以與 互換interface{},因此如果您交換這兩個事件,您將擁有相同的代碼(在Go Playground上嘗試這個):
func printInterface(foo any) {
fmt.Printf("%v\n", foo)
}
func printAny[T interface{}](foo T) {
fmt.Printf("%v\n", foo)
}
- 2 回答
- 0 關(guān)注
- 285 瀏覽
添加回答
舉報