亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何在單個函數中傳遞多類型數組

如何在單個函數中傳遞多類型數組

Go
呼啦一陣風 2023-06-12 17:27:25
我有多個結構type Base struct {     Id string     Name string     Code string}type Country struct {     Base     ... }type City struct {     Base     ... }我需要創建一個包含城市或國家/地區數組的函數。目前,我為每種類型都有一個功能,它正在做同樣的事情,我想這不是最好/好的方法!
查看完整描述

2 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

看起來您正在嘗試在 Go 中重新創建類繼承。Go 故意沒有類繼承。不要試圖重新創建它。我相信您在想“國家是基地”。那是不正確的。國家嵌入基地。那不是一回事。這對你如何命名事物很重要。在這種情況下,“基地”似乎真的是“位置元數據”,所以我們就這樣稱呼它。


type LocationMeta struct {

    id   string

    name string

    code string

}

而且您需要一個適用于各種位置的界面。


type Location interface {

    Id() string

    Name() string

    Code() string

}

我們可以使 LocationMeta 符合 Location,盡管這可能有點奇怪(元數據真的是Location 嗎?)。但它有效。


func (b LocationMeta) Id() string {

    return b.id

}


func (b LocationMeta) Name() string {

    return b.name

}


func (b LocationMeta) Code() string {

    return b.code

}

我們可以將 LocationMeta 嵌入城市中:


type City struct {

    LocationMeta

}

而且免費的是,City 現在符合 Location。


也就是說,通常你不會為這么小的沒有邏輯的東西而煩惱這種嵌入。那真是太過分了;我只是在演示它,因為您似乎正在使用它。通常,您只需符合每種類型本身:


type Country struct {

    id   string

    name string

    code string

}


func (c Country) Id() string {

    return c.id

}


func (c Country) Name() string {

    return c.name

}


func (c Country) Code() string {

    return c.code

}

Go 的偉大之處在于它不關心你如何符合接口。City 和 Country 都以完全不同的方式符合 Location,這完全沒問題。


所以你可以創建一個城市:


boston := City{LocationMeta{id: "bos", name: "Boston", code: "bos"}}

看看這有多奇怪?由于嵌入對象,我們必須創建一個 LocationMeta。有時它是值得的(而且非常強大),但我可能會以鄉村方式(沒有 LocationMeta)完成城市和鄉村:


us := Country{id: "us", name: "USA", code: "us"}

但是,它們都是位置,因此我們可以將它們放在一個切片中:


locations := []Location{boston, us}

并將它們傳遞給事物:


func printLocations(locations []Location) {

    fmt.Println(locations)

}


printLocations(locations)


查看完整回答
反對 回復 2023-06-12
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

我已經在評論中發布了這個,但你可以這樣做


func myfunc(in interface{}) {

    switch in.(type) {

    case []Country:

        // country logic here

    case []City:

        // city logic here

    }

}


查看完整回答
反對 回復 2023-06-12
  • 2 回答
  • 0 關注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號