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

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

Golang:隱式結(jié)構(gòu)匹配

Golang:隱式結(jié)構(gòu)匹配

Go
慕尼黑的夜晚無繁華 2023-02-06 19:01:15
考慮這段代碼:type Rectangle struct {    Width, Height, Area int}type Square struct {    Side, Area int}type Geometry struct {    Area int}func SumGeometries(geometries ...Geometry) (sum int) {    for _, g := range geometries {        sum += g.Area    }    return}func TestSumGeometries(t *testing.T) {    rect := Rectangle{5, 4, 20}    square := Square{5, 25}    got := SumGeometries(rect, square)      // cannot use rect (variable of type Rectangle) as Geometry value in argument to MyFunc compilerIncompatibleAssign    want := 45    if got != want {        t.Error("fail!")    }}我希望 MyFunc 采用包含 Apple 的任何結(jié)構(gòu),而不僅僅是特定的 BStruct。這在 Go 中可以實(shí)現(xiàn)嗎?我能找到 ATM 的唯一方法如下:type Rectangle struct {    Width, Height, Area int}func (r *Rectangle) GetArea() int {    return r.Area}type Square struct {    Side, Area int}func (s *Square) GetArea() int {    return s.Area}type Areaer interface {    GetArea() int}func SumGeometries(geometries ...Areaer) (sum int) {    for _, s := range geometries {        sum += s.GetArea()    }    return}func TestArgs(t *testing.T) {    rect := Rectangle{5, 4, 20}    square := Square{5, 25}    got := SumGeometries(&rect, &square)        // cannot use rect (variable of type Rectangle) as Geometry value in argument to MyFunc compilerIncompatibleAssign    want := 45    if got != want {        t.Error("fail!")    }}感覺可能不符合習(xí)慣:當(dāng)我已經(jīng)對(duì)消費(fèi)者直接訪問數(shù)據(jù)感到滿意時(shí),我是否想用不必要的方法污染我的結(jié)構(gòu)?
查看完整描述

1 回答

?
忽然笑

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

將方法添加到它不會(huì)“污染”的類型。


但是有一種方法可以在不重復(fù)的情況下實(shí)現(xiàn)你想要的。使用方法定義一個(gè)Area包含公共(此處Area)字段的類型GetArea():


type Area struct {

    Value int

}


func (a Area) GetArea() int {

    return a.Value

}

并將其嵌入其他類型:


type Rectangle struct {

    Width, Height int

    Area

}


type Square struct {

    Side int

    Area

}

這樣該GetArea()方法得到提升,Rectangle并將Square自動(dòng)執(zhí)行Areaer。測試它:


rect := Rectangle{5, 4, Area{20}}

square := Square{5, Area{25}}


got := SumGeometries(rect, square)


want := 45


if got != want {

    fmt.Println("fail!")

}

什么都不輸出(沒有錯(cuò)誤)。在Go Playground上嘗試一下。


請(qǐng)注意,如果Area僅包含單個(gè)字段,您甚至可以省略包裝器結(jié)構(gòu)并int直接用作基礎(chǔ)類型:


type Area int


func (a Area) GetArea() int {

    return int(a)

}

然后使用它更簡單:


rect := Rectangle{5, 4, 20}

square := Square{5, 25}

在Go Playground試試這個(gè)。



查看完整回答
反對(duì) 回復(fù) 2023-02-06
  • 1 回答
  • 0 關(guān)注
  • 140 瀏覽

添加回答

舉報(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)