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

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

嵌入式結構方法可以了解父/子嗎?

嵌入式結構方法可以了解父/子嗎?

Go
墨色風雨 2021-10-11 10:56:42
我在空閑時間斷斷續續地使用 Go 工作了幾個月,我覺得我已經掌握了它。來自傳統的 OOP 語言,如 Java 和 PHP,我很難掌握 Go 中的組合和嵌入。我認為它最近終于被點擊并想要更多地使用它,但我的一個想法遇到了障礙。假設我有一個來自具有 Validate 方法的包的結構,我將它嵌入到我當前正在使用的包中的結構中。 有沒有辦法(我擁有這兩個包)可以獲得對結構的引用是在 Validate 方法中嵌入嗎?有點像查看誰給我打電話的方式,因為我會在“父”而不是嵌入式上調用它。我會試著想象這...type B struct {}func (b B) Validate() {  // get reference somehow of A obj}type A struct {  B}a := A{B{}}a.Validate()我覺得這似乎是不可能的,但如果可以的話會很酷。我想您需要使 A 和 B 都具有相同的接口類型才能使其工作。任何想法或幫助將不勝感激。
查看完整描述

2 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

這是不可能的事情。為了更好地理解原因,請查看示例的這個稍微修改過的版本:


type B struct{}


func (b *B) Validate() {

    fmt.Printf("b:%p\n", b)

}


type A struct {

    *B

}


func main() {

    b := B{}

    a1 := A{&b}

    a2 := A{&b}


    a1.Validate()

    a2.Validate()

    a1.B.Validate()

    a2.B.Validate()


    b.Validate()

}

按預期輸出,*B到處都是相同的值(Go Playground):


b: 0x1becd8

b: 0x1becd8

b: 0x1becd8

b: 0x1becd8

b: 0x1becd8

如您所見,我將方法接收器和嵌入類型更改為B.


從這個例子中可以清楚地看出:您可以使用相同的值B(或者更確切地說是值的相同地址B)來嵌入不同的類型值A!


您可以同時調用Validate()兩者:因此,對于給定的*B. 這不會破壞交易,但是:如果值為A,您可以B.Validate()通過編寫調用提升的方法,a.Validate()這是可以的,但您也可以像這樣調用它a.B.Validate()- 現在這一次您實際上沒有A(有爭議,但Validate()被調用的值為*B和 not A),但最后你也可以調用b.Validate()- 這次你絕對沒有A.


父級沒有明確的類型,B(或*B)可以嵌入任何類型(因此它不能是除 之外的任何類型interface{})。


所以形象:你有一個具體的價值,*B當它的Validate()方法被調用時,有時有一個父級,有時沒有。那么擁有父母的理由是什么?


回到你的例子:為了讓這個Validate()方法驗證一些有意義的東西,它應該(必須)Validate()作為參數傳遞給方法 - 顯式而不是自動。


您能做的最好的事情就是 captncraig 在他的回答(+1) 中所寫的內容。


如果你顯式地添加一個方法,A它會B.Validate()像這樣調用,你可以稍微簡化一下:


func (a *A) Validate2() {

    a.Validate(a)

}


// And using it:

a.Validate2()

您想象中嵌入的那種驗證器沒有任何理由A,它應該只是 的一個字段A,或者由于沒有直接關系,它可以是一個“獨立”的驗證器。在這兩種情況下Validate(),A如果您想簡化驗證,您可以添加一個輔助方法。


查看完整回答
反對 回復 2021-10-11
?
回首憶惘然

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

任何類型的parent參考都是不可能的。你希望對父母做什么?由于它們可能是非常不同的類型,因此它們無法做任何有意義的事情。


如果您需要不同類型之間的共同點,則需要一個接口,并且需要將其傳入:


type B struct {}

func (b B) Validate(parent MyInterface) {

}



type A struct {

  B

}

// A implements MyInterface

a := A{B{}}

a.Validate(a)

如果你能解釋你真正想要完成的事情,幾乎肯定有比這更好的方法。


查看完整回答
反對 回復 2021-10-11
  • 2 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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