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

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

Go - 將具有相同嵌入式結(jié)構(gòu)的結(jié)構(gòu)存儲(chǔ)在列表中

Go - 將具有相同嵌入式結(jié)構(gòu)的結(jié)構(gòu)存儲(chǔ)在列表中

Go
冉冉說 2022-10-04 18:47:18
我有多個(gè)具有相同嵌入式結(jié)構(gòu)的結(jié)構(gòu)。在其中一個(gè)結(jié)構(gòu)中,我想存儲(chǔ)嵌入基結(jié)構(gòu)的任何結(jié)構(gòu)的列表。這是一個(gè)展示案例的小片段。package maintype Symbol interface{}type Base struct {    a int32}type Foo struct {    Base    b int32    Symbols []Base    // Below works    // Symbols []Symbol}type Bar struct {    Base    c int32}func main () {    var bar Bar    var foo Foo    foo.Symbols = append(foo.Symbols, bar)}但是,這不起作用。我得到.當(dāng)我使用空界面時(shí),一切都正常。但是,這種方法完全繞過了類型系統(tǒng),因?yàn)楝F(xiàn)在所有內(nèi)容都可以存儲(chǔ)在列表中。我想以某種方式表示只有 ,并且可以存儲(chǔ)在列表中,以便編譯器可以檢查是否滿足此要求。我的結(jié)構(gòu)沒有任何方法,肯定不是那些共享行為并且可以添加到界面中的方法。在接口和虛擬實(shí)現(xiàn)中添加一些虛擬方法似乎非常人為。處理此類情況的Go慣用方法是什么?./main.go:25:22: cannot use bar (type Bar) as type Base in appendSymbolBaseFooBar
查看完整描述

3 回答

?
拉莫斯之舞

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

重要的是相同的界面:


package main


import (

    "fmt"

)


type Item interface{

    fmt.Stringer

}


type ItemA struct {

}


func (a ItemA) String() string {

    return "item A"

}


type ItemB struct {

}


func (a ItemB) String() string {

    return "item B"

}


func main() {

    items := make([]Item, 0)

    items = append(items, ItemA{}, ItemB{})

    fmt.Printf("Items: %v", items)

}


查看完整回答
反對(duì) 回復(fù) 2022-10-04
?
倚天杖

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

您似乎期待的是.Go 不支持非接口類型的動(dòng)態(tài)綁定。因此,您可以使用接口subtype polymorphism


package main


func main(){

    var bar Bar

    var foo Foo

    foo.Symbols = append(foo.Symbols, bar)

}


type Symbol interface {

    Symbol()

}


type Base struct {

    a int32

}


func (b Base)Symbol(){}


type Foo struct {

    Base

    b int32

    Symbols []Symbol

}


type Bar struct {

    Base

    c int32

}

或者,如果您不喜歡使用界面,則可以使用如下所示的技巧來反映。


package main


import "fmt"


func main(){

    var bar Bar

    var foo Foo

    err := foo.AddSymbol(bar)

    if err != nil{

        fmt.Println(err)

    }

}


type Base struct {

    a int32

}


func (b Base)Symbol(){}


type Foo struct {

    Base

    b int32

    symbol []interface{} // field made private

}


// AddSymbol : helper to append values

func (f *Foo)AddSymbol(in interface{})(err error){

    if f.symbol == nil{

        f.symbol = make([]interface{},0)

    }


    switch typ := in.(type) {

    case Base,Bar,Foo:

        f.symbol = append(f.symbol,in)

    default:

        return fmt.Errorf("provided type: %s is not supported",typ)

    }


    return nil

}


type Bar struct {

    Base

    c int32

}


查看完整回答
反對(duì) 回復(fù) 2022-10-04
?
慕絲7291255

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

我做了一些搜索和閱讀。我想要實(shí)現(xiàn)的目標(biāo)需要所謂的“總和類型”。目前 Go 不支持總和類型。但是,很少有替代方法來模擬求和類型的行為。它們?cè)谶@里得到了很好的描述 Go 中求和類型的替代方案。

更重要的是,看起來總和類型可能會(huì)在Go 2中得到支持。進(jìn)一步閱讀建議:規(guī)范:添加總和類型/可區(qū)分的并集,規(guī)范:泛型:使用類型集刪除約束中的類型關(guān)鍵字


查看完整回答
反對(duì) 回復(fù) 2022-10-04
  • 3 回答
  • 0 關(guān)注
  • 110 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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