如果type T2
基於type T1
,除了共享相同的數據字段,T1
和T2
之間是否有任何關係?在Go中,如果T2類型基於T1類型,是否有任何類型的從T1到T2的「繼承」?
package main import "fmt" type T1 struct { s string } func (v *T1) F1() string { return v.s } type T2 T1 func (v *T2) F2() string { return v.s } func main() { var t1 = T1{ "xyz" } var t2 = T2{ "pdq" } s0 := t2.F1() // error - expected ok s1 := ((*T1)(&t2)).F1() // ok - expected s2 := ((*T2)(&t1)).F2() // ok - not expected fmt.Println(s0, s1, s2) }
這裏我的理解是缺乏
一直希望
T2
將繼承T1
的方法,但這種情況並非如此。期待
T2
可以強迫T1
,因爲它是從T1
衍生感到驚訝的是
T1
可以強迫T2
,但事實如此。看來
T1
和T2
之間的關係是完全對稱的 - 儘管實際上是從另一個實際導出的,但我無法找到任何破壞對稱性的東西 - 或者這是幻覺?
(注:我不批評或判斷 - 我完全尊重做出的決定 - 只是驗證我明白了什麼是那裏,對我來說是反直覺的 - 我相信我不是唯一一個!)
所以當你說'輸入T2 T1'時,發生了什麼事情是'T1'的結構被複製爲'T2'的結構,並且它們具有相同的結構,它們可以重新對換,否則'T2'與'T1'沒有任何關係 –
是的。有很多轉換規則。對於這個特定的規則,「T1」和「T2」具有相同的底層類型這一事實意味着它們也具有相同的內存大小,佈局和內容。 – peterSO