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

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

接口類型的函數(shù)返回(另一個(gè))接口類型的結(jié)構(gòu)

接口類型的函數(shù)返回(另一個(gè))接口類型的結(jié)構(gòu)

Go
Qyouu 2022-01-04 21:24:19
我試圖在兩個(gè)存儲之間建立一個(gè)中間層,從存儲 A 獲取,將其轉(zhuǎn)換為相應(yīng)類型的存儲 B,然后存儲它。由于我需要轉(zhuǎn)換大約 50-100 種類型,因此我希望使用 amap[string]func并基于storageA.Type確定我需要調(diào)用的轉(zhuǎn)換函數(shù)。這些轉(zhuǎn)換函數(shù)中的每一個(gè)都將返回不同的結(jié)構(gòu),所有這些都反映了存儲 B 中的不同類型。這些存儲 B 結(jié)構(gòu)中的每一個(gè)都實(shí)現(xiàn)了一個(gè)公共接口,因此它們可以調(diào)用函數(shù)。歸結(jié)為我的問題是,即使實(shí)現(xiàn)了 interface ,我也無法強(qiáng)制func(StorageAType) StorageBType1轉(zhuǎn)換。func(StorageAType) StorageBTypeStorageBtype1StorageBType我創(chuàng)建了這個(gè)相當(dāng)長的游樂場,因?yàn)槲乙庾R到用語言描述問題很棘手。注釋掉第 38-41 和 60-63 行將使其運(yùn)行,但這是我想要使用的那些行。抱歉它的大小,但我想不出一個(gè)不那么冗長但清晰的例子。請注意,我必須重新創(chuàng)建我的 stackoverflow 帳戶,所以我認(rèn)為我沒有代表對答案發(fā)表評論。*編輯:很典型。在詢問之后我才意識到如何解決它。通過在轉(zhuǎn)換器函數(shù)中返回接口類型而不是確切的類型,在這個(gè)操場上發(fā)生了變化。
查看完整描述

1 回答

?
弒天下

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

具有不同結(jié)果類型的函數(shù)類型是不同的類型,結(jié)果類型中的一種是否實(shí)現(xiàn)了另一種并不重要。規(guī)格: 功能類型:


函數(shù)類型表示具有相同參數(shù)和結(jié)果類型的所有函數(shù)的集合。


StorageBtype1和StorageBType是不同的類型,因此以它們作為結(jié)果類型的函數(shù)類型也不同,并且這些函數(shù)類型之一的值不能用作另一個(gè)的值。


只需將所有轉(zhuǎn)換器函數(shù)的結(jié)果類型更改為StorageBType:


func TypeA3ToTypeB1(i StorageAType) StorageBType {

    return StorageBType1{i.Type}

}


func TypeA5ToTypeB2(i StorageAType) StorageBType {

    return StorageBType2{i.Type, i.Name}

}

由于所有返回值都實(shí)現(xiàn)了StorageBType,因此這是一個(gè)有效的更改,不需要對轉(zhuǎn)換器函數(shù)的實(shí)現(xiàn)進(jìn)行更改。


現(xiàn)在當(dāng)然調(diào)用這些函數(shù)將返回一個(gè)類型的值StorageBType。如果這對您來說已經(jīng)足夠/足夠了,那么您無需再做任何事情。


如果您需要將返回值作為存儲在接口值中的具體類型,您可以使用類型斷言。


例如:


a := StorageAType{Type:3}

b := TypeA3ToTypeB1(a) // b is of type StorageBType

if b1, ok := b.(StorageBType1); ok {

    // b1 is of type StorageBType1, you may use it like so:

    fmt.Println("b1.Type:", b1.Type)

} else {

    // b is not of type StorageBType1, or it is nil

}

輸出:


b1.Type: 3

如果要測試許多具體類型,可以使用類型開關(guān):


switch i := b.(type) {

    case nil:

        fmt.Println("nil")

    case StorageBType1:

        // Here i is of type StorageBType1, you may refer to its fields:

        fmt.Println("StorageBType1", i.Type)

    case StorageBType2:

        // Here i is of type StorageBType2, you may refer to its fields:

        fmt.Println("StorageBType2", i.Type, i.Name)

    default:

        fmt.Println("Unhandled type!")

}


查看完整回答
反對 回復(fù) 2022-01-04
  • 1 回答
  • 0 關(guān)注
  • 206 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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