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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

調(diào)用 Go 函數(shù),該函數(shù)接受接口 A 的切片和結(jié)構(gòu) B 的切片(B 實(shí)現(xiàn) A)

調(diào)用 Go 函數(shù),該函數(shù)接受接口 A 的切片和結(jié)構(gòu) B 的切片(B 實(shí)現(xiàn) A)

Go
有只小跳蛙 2021-06-30 13:08:43
我有以下類(lèi)型:type Statement interface {    Say() string}type Quote struct {    quote string}func (p Quote) Say() string {    return p.quote}func Replay(conversation []Statement) {    for _, statement := range conversation {        fmt.Println(statement.Say())    }}我想我很清楚為什么[]Statement不能用[]Quote;調(diào)用接受類(lèi)型參數(shù)的函數(shù);即使Quote執(zhí)行Statement,[]Quote也沒(méi)有執(zhí)行[]Statement。[]Statement甚至不是一個(gè)接口。它有類(lèi)型slice of Statement. 雖然 Go 將類(lèi)型隱式轉(zhuǎn)換為接口類(lèi)型,但它不會(huì)從類(lèi)型A切片到接口切片的隱式轉(zhuǎn)換B。我們可以將引號(hào)顯式轉(zhuǎn)換為語(yǔ)句:conversation := []Quote{    Quote{"Nice Guy Eddie: C'mon, throw in a buck!"},    Quote{"Mr. Pink: Uh-uh, I don't tip."},    Quote{"Nice Guy Eddie: You don't tip?"},    Quote{"Mr. Pink: Nah, I don't believe in it."},    Quote{"Nice Guy Eddie: You don't believe in tipping?"},}// This doesn't work// Replay(conversation)// Create statements from quotesstatements := make([]Statement, len(conversation))for i, quote := range conversation {    statements[i] = quote}Replay(statements)現(xiàn)在說(shuō) Replay 是一個(gè)庫(kù)的一部分,它希望能夠輕松使用 Replay。只要這些對(duì)象實(shí)現(xiàn) Statement 接口,它就允許您使用任何對(duì)象切片調(diào)用 Replay。為此,它具有以下轉(zhuǎn)換方法:func ConvertToStatements(its interface{}) ([]Statement, error) {    itsValue := reflect.ValueOf(its)    itsKind := itsValue.Kind()    if itsKind != reflect.Array && itsKind != reflect.Slice {        return nil, fmt.Errorf("Expected items to be an Array or a Slice, got %s", itsKind)    }    itsLength := itsValue.Len()    items := make([]Statement, itsLength)    for i := 0; i < itsLength; i++ {        itsItem := itsValue.Index(i)        if item, ok := itsItem.Interface().(Statement); ok {            items[i] = item        } else {            return nil, fmt.Errorf("item #%d does not implement the Statement interface: %s", i, itsItem)        }    }    return items, nil}回放看起來(lái)像這樣:func Replay(its interface{}) {    conversation := ConvertToStatements(its)    for _, statement := range conversation {        fmt.Println(statement.Say())    }}我們現(xiàn)在可以直接用引號(hào)調(diào)用 Replay:Replay(conversation)最后,我的問(wèn)題是:有沒(méi)有更簡(jiǎn)單的方法可以讓 Replay 接受任何類(lèi)型 A 的切片,只要 A 實(shí)現(xiàn) Statement 接口?
查看完整描述

3 回答

?
慕斯王

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊

[]Quote切片的內(nèi)存布局與切片不同[]Statement,因此這是不可能的。

所述的背襯陣列[]Quote片將包括連續(xù)的Quote結(jié)構(gòu),而[]Statement片的背襯陣列由接口變量。除了保存Quote結(jié)構(gòu)體(或任何其他實(shí)現(xiàn)接口的類(lèi)型),接口變量還存儲(chǔ)指向所包含值的類(lèi)型信息的指針。這需要確定如何分派Say方法調(diào)用。

不同的數(shù)據(jù)布局意味著您不能交換這兩種切片類(lèi)型,即使通過(guò)不安全的強(qiáng)制轉(zhuǎn)換也是如此:如果您有一種類(lèi)型而需要另一種類(lèi)型,則需要在它們之間手動(dòng)轉(zhuǎn)換。


查看完整回答
反對(duì) 回復(fù) 2021-07-12
?
莫回?zé)o

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

對(duì)您的(長(zhǎng))問(wèn)題的簡(jiǎn)短回答是:不。

我不認(rèn)為你的 ConvertToStatment 和 Replay 采用空接口的解決方案是一個(gè)“不錯(cuò)”的解決方案:我更喜歡func Replay([]Statement)調(diào)用者必須提供一部分 Statments。這更清楚,調(diào)用者可以將他們的內(nèi)容轉(zhuǎn)換為 []Statement 或直接構(gòu)造一個(gè) []Statement。


查看完整回答
反對(duì) 回復(fù) 2021-07-12
  • 3 回答
  • 0 關(guān)注
  • 250 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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