第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

any/interface{} 作為約束與參數(shù)類型之間的區(qū)別?

any/interface{} 作為約束與參數(shù)類型之間的區(qū)別?

Go
有只小跳蛙 2022-11-23 20:21:03
由于最近在 Go 1.18 中發(fā)布了泛型,我已經(jīng)開始學習它們了。我通常能理解這個概念,因為我過去有一些 Java 經(jīng)驗。但我沒有得到一些實施細節(jié)。例如:什么時候更適合使用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")}兩種實現(xiàn)都有效。但是,如果我嘗試nil使用any-version 進行打印,則會出現(xiàn)編譯時錯誤:無法推斷 T。https://go.dev/play/p/0gmU4rhhaOP如果我嘗試nil使用interface{}-version 打印,我將不會收到此錯誤。那么用例是any什么?與簡單使用相比,它何時以及帶來哪些好處interface{}?我要求提供一個具體示例,其中一種實現(xiàn)客觀上比另一種更合適和/或存在可以評估的特定好處。
查看完整描述

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接口類型的變量。


查看完整回答
反對 回復 2022-11-23
?
GCT1015

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)

}


查看完整回答
反對 回復 2022-11-23
  • 2 回答
  • 0 關(guān)注
  • 285 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號