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如果您想簡化驗證,您可以添加一個輔助方法。

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)
如果你能解釋你真正想要完成的事情,幾乎肯定有比這更好的方法。
- 2 回答
- 0 關注
- 178 瀏覽
添加回答
舉報